我有如下Pandas DataFrame("ID"和"col1"的数据类型是"Object"):

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,我们有两个不同的值:"ABC"和"DD"
  • 对于ID=44的col1_num=1,因为对于"col1"中的ID=44,我们有一个值:"RoR"
  • 对于ID=55 col1_num=1,因为对于"col1"中的ID=5,我们有1个值:"XX"

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

推荐答案

如果输入数据中有2列,则使用DataFrame.drop_duplicates和Aggregate 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并获得每个另一列的第一个值(因 for each 组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

Python相关问答推荐

当变量也可以是无或真时,判断是否为假

在Python中根据id填写年份系列

Snap 7- read_Area用于类似地址的变量

单击Python中的复选框后抓取数据

如何在不使用字符串的情况下将namedtuple属性传递给方法?

telegram 机器人API setMyName不起作用

Polars -转换为PL后无法计算熵.列表

从 struct 类型创建MultiPolygon对象,并使用Polars列出[list[f64]列

有什么方法可以避免使用许多if陈述

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

Pandas 第二小值有条件

当多个值具有相同模式时返回空

将整组数组拆分为最小值与最大值之和的子数组

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

如何在polars(pythonapi)中解构嵌套 struct ?

无法使用requests或Selenium抓取一个href链接

我对我应该做什么以及我如何做感到困惑'

Stacked bar chart from billrame

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

Pandas:计算中间时间条目的总时间增量