熊猫:通过将一列的值与另一行中同一列的另一个值进行比较来过滤行

时间:2020-02-05 12:49:30

标签: pandas

我已经搜索了其中的内容,但我认为没有发现任何适用的内容。但是我是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'循环,但这只是一个错误)。

在这种情况下,我通常会发布一些示例代码,但是到目前为止,我认为我的任何方法都没有多大意义。

任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:1)

GroupBy.transformnunqiue一起使用:

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