我已经搜索了其中的内容,但我认为没有发现任何适用的内容。但是我是Pandas的新手,所以在这种情况下我可能会错过一些歉意。
假设我有一个数据框df,其内容如下:
Column1 Column2
A Apple
B Apple
A Pear
A Orange
B Orange
A Pear
我想过滤数据框以仅显示其中的行:
-Column2的值至少与其他1个Column2值匹配
-对于这2个匹配的行,Column1的值中至少有1个是不同的。
上述df的预期结果:
Column1 Column2
A Apple
B Apple
A Orange
B Orange
我已经尝试使用.loc()方法,但是找不到合适的过滤器/过滤器组。 (我也尝试使用'for i in df'循环,但这只是一个错误)。
在这种情况下,我通常会发布一些示例代码,但是到目前为止,我认为我的任何方法都没有多大意义。
任何帮助将不胜感激,谢谢。
答案 0 :(得分:1)
将GroupBy.transform
与nunqiue
一起使用:
df_filtered = df[df.groupby('Column2')['Column1'].transform('nunique').gt(1)]
print(df_filtered)
我们也可以使用pd.crosstab
:
df[df['Column2'].map(pd.crosstab(df['Column1'],df['Column2']).gt(0).sum().gt(1))]
#df[df['Column2'].map(pd.crosstab(df['Column1'],df['Column2']).where(lambda x: x>0).count().gt(1))]
我们也可以使用groupby.filter
一般来说,这速度较慢
df.groupby('Column2').filter(lambda x: x.Column1.nunique()>1)
输出
Column1 Column2
0 A Apple
1 B Apple
3 A Orange
4 B Orange
最好的解决方案是第一个groupby.transform
答案 1 :(得分:1)
您可以使用groupby并进行过滤:
(
df.groupby('Column2')
.filter(lambda x: len(x.drop_duplicates(subset='Column1'))>1)
)
Column1 Column2
0 A Apple
1 B Apple
3 A Orange
4 B Orange