大佬教程收集整理的这篇文章主要介绍了在 Pandas 中过滤多个值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的数据框,如何显示购买了产品 A 和 B 但没有购买产品 C 的客户的 customer_ID,按客户 ID 升序排列。
尝试使用 groupby
和 filter
out = df.groupby('customer_id').\
filter(lambda x : pd.Series( ['A','B']).isin(x['product_n']).all() \
& (~x['product_n'].isin(['C']).any()))
,
您可以为 'A','B'
创建一个集合,并检查该集合是 product_n
的 groupby 的结果的子集。还要检查 C
是否不在 product_n
中。这两者的组合将是 True 或 False。然后仅过滤掉 True 以获取购买了产品 'A'
和 'B'
而不是 'C'
的客户 ID。
这是我的实现方式。
import pandas as pd
df = pd.DataFrame({'cust_id':[1,1,2,3,3],'prod_nm':['A','B','A','C','D']})
print (df)
ab = {'A','B'}
dfs = df.groupby('cust_id')['prod_nm'].apply(lambda x: (('C' not in x.tolist()) & (ab.issubset(x))))
#
print (dfs.loc[dfs])
这会给你:
cust_id
1 True
如果您正在为此寻找列表推导式以便将它们放入列表中,那么您可以这样做:
dfx = [k for k,v in df.groupby('cust_id')['prod_nm'].apply(set).items() if ab.issubset(v) and 'C' not in v]
print (dfx)
这样做的结果是:
[1]
对于更新后的 DataFrame,结果如下:
cust_id prod_nm
0 1 A
1 1 B
2 2 A
3 2 B
4 2 C
5 3 A
6 3 A
7 3 B
8 3 D
使用 dfs.iloc 的结果:
cust_id
1 True
3 True
Name: prod_nm,dtype: bool
使用列表理解的结果
[1,3]
,
您可以使用 pandas.DataFrame.groupby
、pandas.core.groupby.SeriesGroupBy.unique
和 pandas.Series.apply
:
(df.groupby("customer_id")["product_n"].unique()
.apply(lambda x: 'A' in x and 'B' in x and not 'C' in x))
以上是大佬教程为你收集整理的在 Pandas 中过滤多个值全部内容,希望文章能够帮你解决在 Pandas 中过滤多个值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。