Pandas 输出差异列
Pandas output difference columns
给定一个 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]
另一个更简单的shorthand可能是
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
更新
s.stack()[s.stack()].reset_index(level=1).groupby(level=0)['level_1'].apply(','.join)
Out[959]:
Id
111 X,Y,Z
222 Name,X,Y
Name: level_1, dtype: object
给定一个 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]
另一个更简单的shorthand可能是
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
更新
s.stack()[s.stack()].reset_index(level=1).groupby(level=0)['level_1'].apply(','.join)
Out[959]:
Id
111 X,Y,Z
222 Name,X,Y
Name: level_1, dtype: object