如何添加以Pandas形式列出另一列的所有值的指标列

6yoyoihd  于 2023-02-02  发布在  其他
关注(0)|答案(2)|浏览(88)

我有以下Pandas Dataframe :

import pandas as pd
pd.DataFrame({'id': [1,1,1,1,2,2,2], 'col': ['a','b','c','c','a','b','d']})

id  col
0   1   a
1   1   b
2   1   c
3   1   c
4   2   a
5   2   b
6   2   d

我想添加一个新列,该列将包含col x x x的唯一值列表
结束 Dataframe 如下所示:

pd.DataFrame({'id': [1,1,1,1,2,2,2], 'col': ['a','b','c','c','a','b','d'],
             'col2': [['a','b','c'],['a','b','c'],['a','b','c'],['a','b','c'],
                     ['a','b','d'],['a','b','d'],['a','b','d']]})

id  col col2
0   1   a   [a, b, c]
1   1   b   [a, b, c]
2   1   c   [a, b, c]
3   1   c   [a, b, c]
4   2   a   [a, b, d]
5   2   b   [a, b, d]
6   2   d   [a, b, d]

我怎么能这么做?

os8fio9y

os8fio9y1#

使用GroupBy.aggreindex的可能解决方案:

df["col2"] = (df.groupby("id")["col"].agg(lambda x: x.unique().tolist())
                  .reindex(df["id"]).values)

输出:

print(df)

   id col       col2
0   1   a  [a, b, c]
1   1   b  [a, b, c]
2   1   c  [a, b, c]
3   1   c  [a, b, c]
4   2   a  [a, b, d]
5   2   b  [a, b, d]
6   2   d  [a, b, d]
gcuhipw9

gcuhipw92#

对于按顺序删除重复值的列表,使用lambda函数中的dict.fromkeys技巧,对于新列,使用Series.map

df['col2'] = df['id'].map(df.groupby('id')['col'].agg(lambda x: list(dict.fromkeys(x))))

或者先按DataFrame.drop_duplicates删除重复项,然后聚合list

df['col2'] = df['id'].map(df.drop_duplicates(['id','col']).groupby('id')['col'].agg(list))

如果可能,使用ndarray s代替list s,使用DataFrameGroupBy.nunique

df['col2'] = df['id'].map(df.groupby('id')['col'].unique())
print (df)
   id col       col2
0   1   a  [a, b, c]
1   1   b  [a, b, c]
2   1   c  [a, b, c]
3   1   c  [a, b, c]
4   2   a  [a, b, d]
5   2   b  [a, b, d]
6   2   d  [a, b, d]

相关问题