繁体   English   中英

如何在 Python Pandas 中的 DataFrame 中使用逗号分隔的重复行列中的值创建列?

[英]How to create column with values from column of duplicated rows separated by commas in DataFrame in Python Pandas?

我有 Pandas DataFrame 如下所示(“ID”和“COL1”的数据类型是“对象”):

ID  | COL1 | COL2 | COL3
----|------|------|----
123 | ABc  | 55   | G4
123 | Abc  | 55   | G4
123 | DD   | 55   | G4
44  | RoR  | 41   | P0
44  | RoR  | 41   | P0
55  | XX   | 456  | RR

我需要:

  1. 创建新列“COL1_cum”,其中将是每个 ID 中的“COL1”中的所有值,以逗号分隔
  2. 删除重复的 ID
  3. 创建新列“COL1_num”,其中将提供每个“ID”在“COL1”中有多少不同级别的信息

因此,我需要以下内容:

ID  | COL1_cum | COL1_num |COL2 | COL3
----|----------|----------|-----|-----
123 | ABc, DD  | 2        | 55  | G4
44  | RoR      | 1        | 41  | P0
55  | XX       | 1        | 456 | RR

COL1_num 的解释:

  • 对于 ID = 123 COL1_num = 2 因为对于“COL1”中的 ID = 123,我们有 2 个不同的值:“ABc”和“DD”
  • 对于 ID = 44 COL1_num = 1 因为对于“COL1”中的 ID = 44,我们有 1 个值:“RoR”
  • 对于 ID = 55 COL1_num = 1 因为对于“COL1”中的 ID = 5,我们有 1 个值:“XX”

如何在 Python Pandas 中做到这一点?

如果输入数据中有 2 列,请使用DataFrame.drop_duplicates和聚合join

df1 = df.drop_duplicates().groupby('ID')['COL1'].agg(','.join).reset_index(name='COL1_cum')

如果可能,可以指定多个列:

df1 = (df.drop_duplicates(['ID','COL1'])
         .groupby('ID')['COL1']
         .agg(','.join)
         .reset_index(name='COL1_cum'))

编辑:

首先删除所有列的重复项:

df1 = df.drop_duplicates()
print (df1)
    ID COL1  COL2 COL3
0  123  ABc    55   G4
2  123   DD    55   G4
3   44  RoR    41   P0
5   55   XX   456   RR

然后聚合joinsize并获取每个其他列的第一个值(因为每个组ID的值相同):

df2 = (df1.groupby('ID', sort=False, as_index=False)
          .agg(COL1_cum =('COL1',','.join),
               COL1_num=('COL1','size'),
               COL2=('COL2','first'),
                COL3=('COL3','first')))
print (df2)
    ID COL1_cum  COL1_num  COL2 COL3
0  123   ABc,DD         2    55   G4
1   44      RoR         1    41   P0
2   55       XX         1   456   RR

EDIT2:真实数据不会被所有列复制,可能的解决方案:

df2 = (df.groupby('ID', sort=False, as_index=False)
          .agg(COL1_cum =('COL1',lambda x: ','.join(dict.fromkeys(x))),
               COL1_num=('COL1','nunique'),
               COL2=('COL2','first'),
                COL3=('COL3','first')))
print (df2)
    ID COL1_cum  COL1_num  COL2 COL3
0  123   ABc,DD         2    55   G4
1   44      RoR         1    41   P0
2   55       XX         1   456   RR

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM