"查找重复列,并添加相应列的对应行"

2024-10-03 17:22:49 发布

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

我想检查一列的重复行并添加其他列的相应行。 如果日期框架如下所示:

 A     B         C         D  E  F  G  
13348  xyzqr     324580    1  1  1  1
13348  grpret    325810    4  4  4  4
45832  gberthh   258729    2  1  3  4
45832  bhdrffe   025892    2  1  1  4
58712  bgrtw     984562    2  2  2  2
76493  hzrt      638495    1  1  1  2
643509 .         T648501   1  1  1  1
643509 .         R648501   1  1  1  1

之后,添加列(B、C、D、E、F)的对应行必须检查对应行的所有列是否相等。如果相等,则为其他列指定相同的数字,否则为“0”。
对于上面的例子,由于13348有两个重复的行,并且相应行的加法给出了(D=5,E=5,F=5,G=5)的每列的5,所以输出应该是5。然而,对于45832,在相加后有不同的列(D=4,E=2,F=4,G=8)值,因此输出应为0。
剩余列应该是重复行的最小索引值。你知道吗

输出应如下所示:

   A     B       C       D 
  13348  xyzqr   324580  5
  45832  gberthh 258729  0
  58712  bgrtw   984562  2
  76493  hzrt    638495  0
  643509 .       T648501 2

我很高兴知道一些建议。你知道吗


Tags: 框架数字建议例子t648501grpretbhdrffegberthh
1条回答
网友
1楼 · 发布于 2024-10-03 17:22:49

我认为需要:

cols = ['D','E','F','G']
#for each group transpose df and check if all duplicates
df1 = df.groupby('A')[cols].apply(lambda x: x.T.duplicated(keep=False))
#for duplicates aggregate sum else 0
arr = np.where(df1.all(axis=1), df.groupby('A')[cols[0]].sum(), 0)
#remove unnecessary columns and add new, get first rows per column A
df = df.drop(cols, axis=1).drop_duplicates('A').assign(D=arr)
print (df)
        A        B        C  D
0   13348    xyzqr   324580  5
2   45832  gberthh   258729  0
4   58712    bgrtw   984562  2
5   76493     hzrt   638495  0
6  643509        .  T648501  2

如果所有值都是重复的,则检查每个组的替代解决方案:

cols = ['D','E','F','G']
m = df.groupby('A')[cols].apply(lambda x: x.T.duplicated(keep=False).all())
print (m)
A
13348     True
45832    False
dtype: bool

arr = np.where(m, df.groupby('A')[cols[0]].sum(), 0)
df = df.drop(cols, axis=1).drop_duplicates('A').assign(D=arr)
print (df)
        A        B        C  D
0   13348    xyzqr   324580  5
2   45832  gberthh   258729  0
4   58712    bgrtw   984562  2
5   76493     hzrt   638495  0
6  643509        .  T648501  2

相关问题 更多 >