如何选择过滤器选择列表中的列列表

2024-04-24 14:44:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够过滤一个数据帧,并保留列列表在选择列表中的行。你知道吗

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,但没有找到解决办法。你知道吗

提前谢谢。你知道吗


Tags: 数据mapdataframedf列表rangefilterloc
3条回答

一位同事通过创建一个过滤数据帧,为我提供了一个关于大数据帧的更快的解决方案:

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")
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

使用应用:

>>> 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

相关问题 更多 >