假设我有一个包含3列的数据帧,其中一列包含组,我将为每个组收集其他2列中的值集合。
通常我会使用pandas.groupby函数并应用唯一的方法。如果unique应用于1列以上,则此操作无效。。。
df = pd.DataFrame({
'group': [1, 1, 2, 3, 3, 3, 4],
'param1': [1, 5, 8, np.nan, 2, 3, np.nan],
'param2': [5,6,9,10,11,12,1]
})
在1列上应用唯一:
df.groupby('group')['param1'].unique()
group
1 [1.0, 5.0]
2 [8.0]
3 [nan, 2.0, 3.0]
4 [nan]
Name: param1, dtype: object
在2列上应用唯一:
df.groupby('group')[['param1', 'param2']].unique()
我得到一个属性错误:
AttributeError: 'DataFrameGroupBy' object has no attribute 'unique'
相反,我希望这个数据帧:
param1 param2
group
1 [1.0, 5.0] [5, 6]
2 [8.0] [9]
3 [nan, 2.0, 3.0] [10,11,12]
4 [nan] [1]
错误原因是unique
仅适用于Series
,因此仅实现SeriesGroupBy.unique
。
对于我使用Series.unique
转换到列表:
df = df.groupby('group')[['param1', 'param2']].agg(lambda x: list(x.unique()))
print (df)
param1 param2
group
1 [1.0, 5.0] [5, 6]
2 [8.0] [9]
3 [nan, 2.0, 3.0] [10, 11, 12]
4 [nan] [1]
df = df.groupby('group').agg({'param1': 'unique',
'param2': 'unique'})
print(df)
param1 param2
group
1 [1.0, 5.0] [5, 6]
2 [8.0] [9]
3 [nan, 2.0, 3.0] [10, 11, 12]
4 [nan] [1]
如果你有很多组,并且你想要相同的行为(即唯一(,那么我们可以在groupby之前使用.stack
,这样你就不需要手动调用每一列。
df.set_index('group').stack(dropna=False).groupby(level=[0,1]).unique().unstack()
param1 param2
group
1 [1.0, 5.0] [5.0, 6.0]
2 [8.0] [9.0]
3 [nan, 2.0, 3.0] [10.0, 11.0, 12.0]
4 [nan] [1.0]