如何在熊猫中按user_id按组从列表列中获取唯一值

时间:2019-06-27 09:48:20

标签: python pandas set pandas-groupby

输入:-

    print(df)
device_id           ids
025c08d535a074b4    [8972]
025c08d535a074b4    [10595, 10595]
02612734f96edc43    [10016, 8795, 10019, 8791, 8351, 8791]
02612734f96edc43    [10016, 8795, 10019, 8791, 8351, 10052, 8345]

应该为每个device_d输出唯一的ID列表,例如:

device_id           ids
025c08d535a074b4    [8972,10595]
02612734f96edc43    [10016, 8795, 10019,8791,8351,10052, 8345]

我尝试使用:->

    df=pd.DataFrame(df.groupby('device_id')['ids'].apply(set))

但无法正常工作,它在ID前添加'并返回类似列表。

device_id           ids
025c08d535a074b4    [8972,'10595, 10595]
02612734f96edc43    ['10016,8795,10019,8791,8351,8791,'10016]

2 个答案:

答案 0 :(得分:3)

使用numpy.hstacknumpy.unique

import numpy as np

df.groupby('device_id')['ids'].apply(lambda x: np.unique(np.hstack(x)))

或者如果维护顺序很重要,则将pandas.Series构造函数与drop_duplicates一起使用:

df.groupby('device_id')['ids'].apply(lambda x: pd.Series(np.hstack(x)).drop_duplicates().to_list())

[出]

device_id
025c08d535a074b4                                    [8972, 10595]
02612734f96edc43    [10016, 8795, 10019, 8791, 8351, 10052, 8345]

如果您需要将输出作为DataFrame,只需将其链接到.reset_index

df.groupby('device_id')['ids'].apply(lambda x: np.unique(np.hstack(x))).reset_index()

[出]

          device_id                                            ids
0  025c08d535a074b4                                  [8972, 10595]
1  02612734f96edc43  [8345, 8351, 8791, 8795, 10016, 10019, 10052]

答案 1 :(得分:2)

尝试使用:

>>> grouped = df.groupby('device_id', as_index=False).sum()
>>> grouped['ids'] = grouped['ids'].apply(lambda x: sorted(set(x), key=x.index))
>>> grouped
          device_id                                            ids
0  025c08d535a074b4                                  [8972, 10595]
1  02612734f96edc43  [10016, 8795, 10019, 8791, 8351, 10052, 8345]
>>>