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]