【问题标题】:Pandas: How to create a counter for each duplicated row in a dataframePandas:如何为数据框中的每个重复行创建一个计数器
【发布时间】:2021-10-02 17:00:53
【问题描述】:

我使用 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)

这是输出:

【问题讨论】:

  • 只需阅读您对使用的最终代码和结果的编辑。我想我明白为什么你从 postgres 和 Pandas 得到两个计数差异的原因。是因为你的代码过滤了重复条目:newdf = healthdf[healthdf.duplicated()].copy()你可以参考official doc of .duplicated()这个函数设置每组重复条目的第一行为假,其他为真。因此,您生成的 newdf 删除了每个重复集的第一行。所以,每个都得到-1。
  • 要获得正确的计数,您可以使用keep=False 参数为.duplicated()newdf = healthdf[healthdf.duplicated(keep=False)].copy()
  • 现在有相同的计数吗?
  • 太好了,我们终于解决了,尽管付出了一定的努力! :-)
  • 嗨@Ori Hait 看到你有足够的声望来投票了。如果您发现我以前的帮助有帮助,您会考虑支持我的回答吗?您可以通过单击向上箭头 ▲ 来支持我的回答(请参阅 How to upvote on Stack Overflow?)。谢谢!

标签: python pandas data-analysis


【解决方案1】:

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

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

由于您的数据包含NaN,我们必须在.groupby() 中使用参数dropna=False 以获得count 的完整列表,包括具有NaN 值的行。否则,具有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() 解决方案遇到内存问题,我们可以通过.value_counts() 获取count 来使用.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

【讨论】:

猜你喜欢
  • 2021-10-17
  • 2012-08-13
  • 1970-01-01
  • 2018-07-26
  • 2021-12-09
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多