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