Чтобы выбрать строки, значение столбца которых равно скаляру, some_value
, используйте ==
:
df.loc[df['column_name'] == some_value]
Чтобы выбрать строки, значение столбца которых в итерабельном, some_values
, используйте isin
:
df.loc[df['column_name'].isin(some_values)]
Объединить несколько условий с &
:
df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]
Выбрать строки, значение столбца не равно some_value
, используйте !=
:
df.loc[df['column_name'] != some_value]
isin
возвращает булевскую серию, поэтому для выбора строк, значение которых не в some_values
, отмените булевскую серию используя ~
:
df.loc[~df['column_name'].isin(some_values)]
Например,
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
# A B C D
# 0 foo one 0 0
# 1 bar one 1 2
# 2 foo two 2 4
# 3 bar three 3 6
# 4 foo two 4 8
# 5 bar two 5 10
# 6 foo one 6 12
# 7 foo three 7 14
print(df.loc[df['A'] == 'foo'])
дает
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
Если у вас несколько значений вы хотите включить, поместить их в список (или, в более общем плане, любой итерабельный) и использовать isin
:
print(df.loc[df['B'].isin(['one','three'])])
дает
A B C D
0 foo one 0 0
1 bar one 1 2
3 bar three 3 6
6 foo one 6 12
7 foo three 7 14
Примечание, однако, если вы хотите сделать это много раз, более эффективно сначала сделать индекс, а затем использовать df.loc
:
df = df.set_index(['B'])
print(df.loc['one'])
дает
A C D
B
one foo 0 0
one bar 1 2
one foo 6 12
или, чтобы включить несколько значений из использования индекса df.index.isin
:
df.loc[df.index.isin(['one','two'])]
дает
A C D
B
one foo 0 0
one bar 1 2
two foo 2 4
two foo 4 8
two bar 5 10
one foo 6 12
Это то, для чего нужны типы. Тип, который вы используете для времен, должен отражать ограничения, которые вы хотите наложить на значения, которые он представляет.
Например, вы можете обернуть UTCTime
примерно так:
newtype UTCTimeMicroseconds = UTCTimeMicroseconds { picos :: UTCTime }
microsecondsFromPicos :: UTCTime -> UTCTimeMicroseconds
microsecondsFromPicos = ...
getCurrentTimeMilliseconds :: IO UTCTimeMicroseconds
getCurrentTimeMilliseconds = microsecondsFromPicos <[110]gt; getCurrentTime
И использовать новый тип везде в вашем пакете, чтобы вам понадобилось время, чтобы иметь это свойство.
Если вы хотите быть строгими в этом, не экспортируйте конструктор UTCTimeMicroseconds
, поэтому единственный способ получить одно из этих значений - использовать microsecondsFromPicos
, который реализует ваше требование.
Это делает любое неправильное использование ошибкой, а не предупреждением, но в большинстве случаев это именно то, что вам нужно.
Если вы хотите использовать UTCTime
с полным разрешением, или вам просто все равно, вы можете просто использовать этот тип как обычно. Будет легко найти места в вашей кодовой базе, где это произойдет, потому что они будут только местами, где используется UTCTime
.
Я не могу придумать способ сделать это прямо сейчас, но я думаю, что ближайший вы можете получить что-то вроде:
my-time
, который зависит от [112 ] реэкспорт ваших функций прокладок с комментариями, например
import qualified Data.Time as Time
{-# WARNING getCurrentTime "you should prefer getCurrentTimeMicroseconds" #-}
getCurrentTime = Time.getCurrentTime
, зависит от my-time
в ваших пакетах
очевидно, что это не дает вам способа принудительно импортировать Data.Time.getCurrentTime
, а не , и еще менее удовлетворительно, когда код, который вы хотите подобрать, находится в Prelude или base
. [ 1113]