Я хотел бы получить значения из столбца n
, где значения в подмножестве других столбцов равны True.
Пример, фрейм данных:
t, f = True, False
data = [
[t, f, f, '1'],
[f, f, f, '2'],
[f, t, f, '3'],
[f, f, t, '4']
]
df = pd.DataFrame(data, columns=list("abcn"))
дф как таблица
a b c n
0 True False False 1
1 False False False 2
2 False True False 3
3 False False True 4
столбцы для поиска - это a
и b
, и я хочу получить записи из n
, где эти столбцы True
, что я пробовал:
fcols = ("a", "b")
df[df[[*fcols]] == t].dropna(axis=0, how='all')
это дайте мне правильные записи, но с Nan
в колонке n
a b c n
0 True NaN NaN NaN
2 NaN True NaN NaN
Я чувствую, что я более или менее близок к решению, но...
Используйте any для агрегирования логических значений для вашего логического индексирования:
fcols = ("a", "b")
out = df[df[[*fcols]].eq(t).any(axis=1)]#.dropna(axis=0, how='all') # dropna not needed
Выход:
a b c n
0 True False False 1
2 False True False 3
Промежуточная серия индексации:
df[[*fcols]].eq(t).any(axis=1)
0 True
1 False
2 True
3 False
dtype: bool
Используйте DataFrame.any для проверки хотя бы одного True
совпадения на строку для логического ряда, переданного в логическое индексирование:
fcols = ("a", "b")
df = df[df[[*fcols]].eq(t).any(axis=1)]
#if need test Trues, possible remove compare by True
df = df[df[[*fcols]].any(axis=1)]
print (df)
a b c n
0 True False False 1
2 False True False 3
Подробности:
print (df[[*fcols]].eq(t).any(axis=1))
0 True
1 False
2 True
3 False
dtype: bool
Я решил таким образом
df = df[df['a'] | df['b']]
In [5]: df
Out[5]:
a b c n
0 True False False 1
2 False True False 3
Спасибо за ответ! но требуется использование кортежа.