如何解决应用于多个列的熊猫唯一不适用于groupby对象
让我们说我有一个包含3列的数据框,其中一个包含组,我将为每个组在其他2列中收集值的集合。
通常我会使用pandas.groupby函数并应用唯一方法。好吧,如果对超过1列应用唯一的话,这是行不通的...
df = pd.DataFrame({
'group': [1,1,2,3,4],'param1': [1,5,8,np.nan,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:
AttributeError: 'DataFrameGroupBy' object has no attribute 'unique'
相反,我希望这个数据帧:
param1 param2
group
1 [1.0,5.0] [5,6]
2 [8.0] [9]
3 [nan,3.0] [10,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]
,
compound_2
,
如果您有多个组,并且您想要相同的行为(即唯一的行为),那么我们可以在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,3.0] [10.0,11.0,12.0]
4 [nan] [1.0]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。