当Pandas unique应用于多个列时,它不适用于groupby对象



假设我有一个包含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]

最新更新