Pandas 输出差异列
给定df: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
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:-)