pandas 将列表作为值的列聚合到panda Dataframe 中

6rqinv9w  于 2023-02-28  发布在  其他
关注(0)|答案(3)|浏览(128)

我有一个数据框,其中有3列,其中一列有一个值列表。
我想在执行groupby时将该列表聚合为单个列表。
数据框如下所示
| C1|C2|C3|
| - ------|- ------|- ------|
| 1个|[甲、乙]|你好|
| 第二章|钠氮|波|
| 1个|[乙、丙]|哟|
| 第二章|["D"、"E"]|是呀|
现在,我希望 Dataframe 如下所示
| C1|C2|C3|
| - ------|- ------|- ------|
| 1个|[甲、乙、丙]|["嗨","哟"]|
| 第二章|["D"、"E"]|["阿宝","是"]|
我使用了以list past为参数的agrregating函数,但得到的结果如下
| C1|C2|C3|
| - ------|- ------|- ------|
| 1个|[["A","B"],["B","C"]]|["嗨","哟"]|
| 第二章|["D"、"E"]|["阿宝","是"]|
有没有人能帮上忙如何得到这个结果?

pb3skfrl

pb3skfrl1#

您可以使用numpy

import numpy as np

(df.groupby('C1', as_index=False)
   .agg({'C2': lambda g: np.unique(np.r_[tuple(g.dropna())].ravel()),
         'C3': list
        })
)

输出:

C1         C2         C3
0   1  [A, B, C]   [Hi, Yo]
1   2     [D, E]  [Po, Yup]
wwtsj6pe

wwtsj6pe2#

使用groupby和agg对每列应用不同的函数:

import pandas as pd
import numpy as np

df = pd.DataFrame({'C1': [1, 2, 1, 2],
                   'C2': [['A', 'B'], None, ['B', 'C'], ['D', 'E']],
                   'C3': ['Hi', 'Po', 'Yo', 'Yup']})

df = df.groupby('C1').agg({'C2': lambda x: np.unique([value for value in x.dropna()]),
                                   'C3': list})
df

输出:
| C1|C2|C3|
| - ------|- ------|- ------|
| 1个|[阿、乙、丙]|[嗨,哟]|
| 第二章|[德、英]|[阿宝,是的]|

cgvd09ve

cgvd09ve3#

你有没有想过在集体行动前爆炸?

数据

import pandas as pd
df = pd.DataFrame(
    {'C1':[1, 2, 1, 2],
     'C2': [['A', 'B'], '', ['B', 'C'], ['D', 'E']],
     'C3': ['Hi', 'Po', 'Yo', 'Yup']})

爆炸

df1 = df.explode('C2')
print(df1)

输出

C1 C2   C3
0   1  A   Hi
0   1  B   Hi
1   2      Po
2   1  B   Yo
2   1  C   Yo
3   2  D  Yup
3   2  E  Yup

分组依据和唯一性

df1.groupby('C1')\
  .agg(
    {"C2": "unique",
     "C3": "unique"})

输出

C2         C3
C1                      
1   [A, B, C]   [Hi, Yo]
2    [, D, E]  [Po, Yup]

完整代码

df_out = df.explode('C2')\
  .groupby('C1')\
  .agg(
    {"C2": "unique",
     "C3": "unique"})

现在,您最终可以删除''或nan。

相关问题