Pandas 输出差异列

Pandas 输出差异列,pandas,difference,Pandas,Difference,给定df: Id Name X Y Z 111 abc 1 3 5 111 abc 0 1 222 ijk 2 222 lmo 1 1 按Id对它们进行分组(因为它们的Id始终匹配),我想输出所有具有不同值的列名: Id Diff 111 X, Y, Z 222 Name, X, Y 通常我使用np.where来找出差异,但我认为在这种情况下它不会有帮助。如有任何建议,将不胜感激。非常感谢 使用 In [184]: df.groupby('Id').apply(lamb

给定df:

Id  Name X Y Z
111 abc  1 3 5 
111 abc  0   1
222 ijk    2
222 lmo  1 1
按Id对它们进行分组(因为它们的Id始终匹配),我想输出所有具有不同值的列名:

Id  Diff
111 X, Y, Z
222 Name, X, Y
通常我使用np.where来找出差异,但我认为在这种情况下它不会有帮助。如有任何建议,将不胜感激。非常感谢

使用

In [184]: df.groupby('Id').apply(lambda x: x.columns[x.nunique().ne(1)].tolist())
Out[184]:
Id
111       [X, Y, Z]
222    [Name, X, Y]
dtype: object
还有,使用列名

In [210]: df.groupby('Id').apply(
              lambda x: x.columns[x.nunique().ne(1)].tolist()
            ).reset_index(name='Diff')
Out[210]:
    Id          Diff
0  111     [X, Y, Z]
1  222  [Name, X, Y]
另一种更简单的速记方法是

In [213]: df.groupby('Id').nunique().ne(1).dot(df.columns)
Out[213]:
Id
111       XYZ
222    NameXY
dtype: object
使用

还有,使用列名

In [210]: df.groupby('Id').apply(
              lambda x: x.columns[x.nunique().ne(1)].tolist()
            ).reset_index(name='Diff')
Out[210]:
    Id          Diff
0  111     [X, Y, Z]
1  222  [Name, X, Y]
另一种更简单的速记方法是

In [213]: df.groupby('Id').nunique().ne(1).dot(df.columns)
Out[213]:
Id
111       XYZ
222    NameXY
dtype: object

使用
nunique

s=df.groupby('Id').apply(lambda x : (len(x)<=x.nunique()))

s.mul(s.columns).iloc[:,1:].apply(','.join,1)


Id
111       ,X,Y,Z
222    Name,X,Y,
dtype: object

使用
nunique

s=df.groupby('Id').apply(lambda x : (len(x)<=x.nunique()))

s.mul(s.columns).iloc[:,1:].apply(','.join,1)


Id
111       ,X,Y,Z
222    Name,X,Y,
dtype: object

谢谢如果可能的话,您是否需要为其创建一个列名。我尝试了df['Diff']=df.groupby('Id').apply(lambda x:x.columns[x.nunique().ne(1)].tolist())但没有成功谢谢!如果可能的话,您是否需要为其创建一个列名。我尝试了df['Diff']=df.groupby('Id').apply(lambda x:x.columns[x.nunique().ne(1)].tolist())但没有工作我在第二行遇到错误:TypeError:无法操作索引(['Id','Name','x','Y','Z',dtype='object'))由于块值无法使用此索引类型执行mul:@TylerNG我想您可能使用了与此处不同的数据结构,您可以尝试我的更新方法,应该可以工作:-)我在第二行遇到错误:TypeError:无法操作索引(['Id','Name','X','Y','Z',dtype='object'))对于块值,无法使用此索引类型执行mul:@TylerNG我认为您可能使用了与此处不同的数据结构,您可以尝试我的更新方法,应该是work:-)