Pandas unique 在应用于多个列时不适用于 groupby 对象
Pandas unique doest not work on groupby object when applied on several columns
假设我有一个包含 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]
假设我有一个包含 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]