我有一个这样的数据框
col1 col2 col3 col4
a a c c
b a c c
c a c c
a b c c
b b c c
c b c c
我有两个列表col1和col2
list1 = [['a', 'b'], ['a']]
list2 = ['a', 'b']
list1具有要从col1筛选的值,list2具有col2的值注意:两个列表的长度相同。
Filter eg : From col1, 'a' and 'b' & col2, 'a'
From col1, 'a' & col2, 'b'
我试过这个
for i, j in zip(list1, list2):
df = df.loc[(df['col1'].isin(i)) & (df['col2'] == j)]
这个的输出结果是空的df,但是我的预期结果是
col1 col2 col3 col4
a a c c
b a c c
a b c c
用于生成数据的代码:
import pandas as pd
df = pd.DataFrame({
'col1': ['a', 'b', 'c', 'a', 'b', 'c'],
'col2': ['a', 'a', 'a', 'b', 'b', 'b'],
'col3': ['c', 'c', 'c', 'c', 'c', 'c'],
'col4': ['c', 'c', 'c', 'c', 'c', 'c'],
})
expected_output = pd.DataFrame({
'col1': ['a', 'b', 'a'],
'col2': ['a', 'a', 'b'],
'col3': ['c', 'c', 'c'],
'col4': ['c', 'c', 'c']
})
list1 = [['a', 'b'], ['a']]
list2 = ['a', 'b']
4条答案
按热度按时间icnyk63a1#
rfbsl7qr2#
IIUC,您可以尝试使用
reduce
连接所有掩码:输出:
gkn4icbw3#
当你重复执行
for cond in conditions: df = df.loc[cond]
时,你实际上是在应用 * 所有 * 条件(和关系)。你的预期输出是当 * 任何 * 条件成立(或关系)时,如下所示:但是,您可以使用
np.bitwise_or.reduce
来创建or
掩码,然后切片,而不是先切片再concat:输出
另一种方法是合并,但会丢失原始索引:
输出(注意索引差异):
oxf4rvwz4#
另一种可能的解决方案,完全基于列表理解:
输出: