Pandas:如何为数据框中的每个重复行创建一个计数器

Pandas: How to create a counter for each duplicated row in a dataframe

我使用 duplicated() 方法创建了一个仅包含重复行的数据框。 我的问题可能很简单。 我想在右侧添加一个计数列,并为每一行计算重复的 df 中重复出现的次数。我考虑过为每一列创建一个 groupby,但这并没有奏效。

类似于df.groupby([*all columns*]).count()

这是 df 的样子:

谢谢!

编辑:

seabean回答并解决了问题, 解决方案可以采用以下任一方法:

newdf = healthdf[healthdf.duplicated(keep = False)].copy()
df_count = newdf.value_counts(dropna = 
False).reset_index(name='count')
df_out = newdf.merge(df_count, how='left')
df_out.drop_duplicates(keep = "first").sort_values("count", ascending 
= False)

col = newdf.columns.to_list()
newdf.groupby(col,dropna=False).size().sort_values(ascending = False)

这是输出:

你可以试试.groupby() + .transform() + size:

df['count'] = df.groupby(df.columns.tolist(), dropna=False)[df.columns[0]].transform('size')

由于您的数据包含 NaN,我们必须在 .groupby() 中使用参数 dropna=False 以获得 count 的完整列表,其中包括 [=18] 的行=] 值。否则,具有 NaN 值的行将被跳过并从 count.

中排除

演示

数据输入

print(df)

  Col1  Col2 Col3 Col4
0  ABC   123  XYZ  NaN       # group #1 of 3
1  ABC   123  XYZ  NaN       # group #1 of 3
2  ABC   678  PQR  def       # group #2 of 1
3  MNO   890  EFG  abc       # group #3 of 4 
4  MNO   890  EFG  abc       # group #3 of 4 
5  CDE   234  567  xyz       # group #4 of 2 
6  ABC   123  XYZ  NaN       # group #1 of 3
7  CDE   234  567  xyz       # group #4 of 2 
8  MNO   890  EFG  abc       # group #3 of 4 
9  MNO   890  EFG  abc       # group #3 of 4 

输出

print(df)

  Col1  Col2 Col3 Col4  count
0  ABC   123  XYZ  NaN      3           
1  ABC   123  XYZ  NaN      3
2  ABC   678  PQR  def      1
3  MNO   890  EFG  abc      4
4  MNO   890  EFG  abc      4
5  CDE   234  567  xyz      2
6  ABC   123  XYZ  NaN      3
7  CDE   234  567  xyz      2
8  MNO   890  EFG  abc      4
9  MNO   890  EFG  abc      4

编辑

如果您使用 .groupby() 解决方案遇到内存问题,我们可以通过获取 count 来使用 .value_counts() 解决方案通过.value_counts(),然后通过.merge()与原始数据帧合并,如下:

df_count = df.value_counts(dropna=False).reset_index(name='count')  

df_out = df.merge(df_count, how='left')    # left join to keep the original row sequence order of df 

结果:

print(df_count)

  Col1  Col2 Col3 Col4  count
0  MNO   890  EFG  abc      4
1  ABC   123  XYZ  NaN      3
2  CDE   234  567  xyz      2
3  ABC   678  PQR  def      1


print(df_out)

  Col1  Col2 Col3 Col4  count
0  ABC   123  XYZ  NaN      3
1  ABC   123  XYZ  NaN      3
2  ABC   678  PQR  def      1
3  MNO   890  EFG  abc      4
4  MNO   890  EFG  abc      4
5  CDE   234  567  xyz      2
6  ABC   123  XYZ  NaN      3
7  CDE   234  567  xyz      2
8  MNO   890  EFG  abc      4
9  MNO   890  EFG  abc      4