选择具有相同ID但在Pandas中具有不同值的行

时间:2018-05-29 11:58:00

标签: python pandas dataframe

我知道这在数据库软件中是可行的,但有没有办法在Python Pandas中做到这一点?

ID1         ID2      Value
1209345     1203     2
1209345     1204     3 <-----
1209345     1205     4
1209345     1203     2
1209345     1204     7 <-----
1209346     1203     1
1209347     1204     5

我有ID1,对应于此,我有多个ID2与值映射。我需要查找ID1ID2匹配的所有条目,但值不同。

我当前的代码计算ID1ID2的唯一组合数,但不考虑每个组合的唯一Value

print(df.groupby(['ID1', 'ID2']).size())

ID1      ID2 
1209345  1203    2
         1204    2
         1205    1
1209346  1203    1
1209347  1204    1
dtype: int64

注意:此问题发布于删除了Link to php file的@RohitGirdhar。我发布的解决方案不一定是唯一的或最好的解决方案;鼓励其他答案。

2 个答案:

答案 0 :(得分:4)

您可以使用nuniquetransform进行过滤:

df = df[df.groupby(['ID1', 'ID2'])['Value'].transform('nunique') > 1]

print (df)
       ID1   ID2  Value
1  1209345  1204      3
4  1209345  1204      7

答案 1 :(得分:1)

一种方法是groupbyset,过滤生成的系列,然后通过ID1&amp;组合过滤原始数据框。 ID2

grps = df.groupby(['ID1', 'ID2'])['Value'].apply(set)
filtered = grps[grps.map(len) > 1].index

res = df[df.set_index(['ID1', 'ID2']).index.isin(filtered)]

print(res)

       ID1   ID2  Value
1  1209345  1204      3
4  1209345  1204      7