我希望能够过滤数据框并保留列表列在选择列表中的行。
df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C': range(4)})
输入:
df
A B C
0 5 1 0
1 6 2 1
2 3 3 2
3 4 5 3
filter_list = [(6,2),(3,3)]
预期结果:
df
A B C
1 6 2 1
2 3 3 2
我尝试使用loc和map,但我找不到解决方案。
提前致谢。
答案 0 :(得分:3)
In [34]: df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C': range(4)})
In [35]: df
Out[35]:
A B C
0 5 1 0
1 6 2 1
2 3 3 2
3 4 5 3
创建元组位置的布尔索引器,然后从框架中选择那些行
In [36]: df.loc[Series(zip(df.A,df.B)).isin([(6,2),(3,3)])]
Out[36]:
A B C
1 6 2 1
2 3 3 2
在0.13(即将发布!)中,您可以执行此操作docs here
In [37]: df.isin({ 'A' : [6,3], 'B' : [2,3] })
Out[37]:
A B C
0 False False False
1 True True False
2 True True False
3 False False False
In [38]: indexer = df.isin({ 'A' : [6,3], 'B' : [2,3] })
In [39]: indexer[['A','B']].all(1)
Out[39]:
0 False
1 True
2 True
3 False
dtype: bool
In [40]: df.loc[indexer[['A','B']].all(1)]
Out[40]:
A B C
1 6 2 1
2 3 3 2
答案 1 :(得分:2)
使用apply:
>>> fltr = df.apply(lambda x: (x["A"], x["B"]) in {(6,2),(3,3)}, axis=1)
# 0 False
# 1 True
# 2 True
# 3 False
# dtype: bool
>>> df[fltr]
A B C
1 6 2 1
2 3 3 2
答案 2 :(得分:1)
一位同事通过创建过滤DataFrame为我提供了一个更快的大数据框架解决方案:
from pandas import merge, DataFrame
df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C': range(4)})
filter_list = [(6,2),(3,3)]
filter_df = DataFrame(filter_list, columns=['A','B'])
filtr = merge(df, filter_df, on=["A","B"], how="inner")