Pandas:比较数据框中组内的行,并创建摘要行以标记/突出显示组中的不同条目

2024-06-28 18:50:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约1200行的熊猫数据框,其中一些行被重复多次。df如下所示:

ID  Serial  Age Grade   Chem    Bio   Math  Phy
M001    2   52   37       1      1     1     1
M001    2   55   37 2     1      0     1
M001    3   51   36,5     1      1     1     0
M001    3   51   46,5     1      0     1     1
M041    2   52   36,1     1      1     0     0
M041    2   51   36,1     2      1     2     4
M041    2   52   36,1     1      1     0    
M041    2   52   36,1     1      1     1    
M010    5   58   37,4     0      1     1     3
M010    5   55   39,4     1      2     1     1
M010    5   58   37,4     1      1     1     1

数据帧中的重复项应该由ID和Serial列标识,我能够做到这一点。但是,我想比较每组ID+序列行,找出它们的不同之处。这有点棘手,因为有时一个组中有2行要比较,有时每个组中的行(要比较)超过2行

我对一个解决方案感兴趣,在这个解决方案中,我可以根据ID和串行列按数据帧分组,然后比较每个组中的行。如果需要记录的两个或多个单元格之间存在差异(例如,在冲突单元格下方有一个X的新行中,或者可能以红色突出显示单元格)。生成的数据帧应如下所示:

ID  Serial  Age  Grade  Chem    Bio  Math   Phy
M001    2    52   37      1      1    1      1
M001    2    55   37      2      1    0      1
M001    2    X            X           X 
M001    3    51   36,5    1      1    1      0
M001    3    51   46,5    1      0    1      1
M001    3         X              X           X
M041    2    52   36,1    1      1    0      0
M041    2    51   36,1    2      1    2      4
M041    2    52   36,1    1      1    0 
M041    2    52   36,1    1      1    1 
M041    2    X            X           X      X
M010    5    58   37,4    0      1    1      3
M010    5    55   39,4    1      2    1      1
M010    5    58   37,4    1      1    1      1
M010    5    X    X       X      X           X

有人能帮忙解决这个问题吗


Tags: 数据iddfageserialphymath解决方案
1条回答
网友
1楼 · 发布于 2024-06-28 18:50:22

您可以通过使用^{}IDSerial进行分组来创建比较标记表,并通过^{}获得每列的唯一条目数。如果唯一条目的数量大于或等于;1或空白

最后,通过^{}将新创建的比较标记表连接回原始数据帧。按IDSerial列按^{}排序,以将相关条目放在一起

df_mark = (df.groupby(['ID', 'Serial'])
             .nunique()
             .gt(1)
             .replace({True: 'X', False: ''})
             .reset_index()
           )

(pd.concat([df, df_mark])
   .sort_values(['ID', 'Serial'])
   .reset_index(drop=True)
)

结果:

      ID  Serial Age Grade Chem Bio Math  Phy
0   M001       2  52    37    1   1    1  1.0
1   M001       2  55    37    2   1    0  1.0
2   M001       2   X          X        X     
3   M001       3  51  36,5    1   1    1  0.0
4   M001       3  51  46,5    1   0    1  1.0
5   M001       3         X        X         X
6   M010       5  58  37,4    0   1    1  3.0
7   M010       5  55  39,4    1   2    1  1.0
8   M010       5  58  37,4    1   1    1  1.0
9   M010       5   X     X    X   X         X
10  M041       2  52  36,1    1   1    0  0.0
11  M041       2  51  36,1    2   1    2  4.0
12  M041       2  52  36,1    1   1    0  NaN
13  M041       2  52  36,1    1   1    1  NaN
14  M041       2   X          X        X    X

相关问题 更多 >