我正在尝试迭代pandas数据框中的一行,检查是否有任何类似的值,如果有相似的值,我想计算重复该值的次数而忽略第一次并将其记录下来一栏。
输入:
pd.DataFrame(
[['K1', 'K2', 'K1', 'R3', 'R1', 'K3'],
['K2', 'K4', 'K4', 'R2', 'R2' ,'R2']],
columns=list('ASDFEI')
)
A S D F E I
0 K1 K2 K1 R3 R1 K3
1 K2 K4 K4 R2 R2 R2
该链接包含显示我要执行的操作的图像。在第一行中,只有K1重复一次,因此计数为1.在第二行中,K4重复一次,R2重复两次,因此计数为3.
答案 0 :(得分:3)
这应该有效:
# Insert column count with count of duplicated (keep=First is default)
df.insert(0,'Count', df.T.apply(pd.Series.duplicated).sum())
print(df)
返回
Count A S D F E I
0 1 K1 K2 K1 R3 R1 K3
1 3 K2 K4 K4 R2 R2 R2
更新:您可以使用pd.Series.isin()和~
创建一个布尔掩码,以滤除不需要的结果。
# Create new Series with count of duplicated (keep=First is default)
newcol = (df.apply(lambda x: x[~x.isin(['TK',np.NaN])]
.duplicated(), axis=1).sum(axis=1).astype(int))
# Insert column
df.insert(0,'Count', newcol)
print(df)
返回:
Count A S D F E I
0 1 K1 TK K1 R3 TK K3
1 2 K2 NaN NaN R2 R2 R2
答案 1 :(得分:3)
IIUC,您可以stack
自己的框架并致电groupby
+ value_counts
df['Count'] = (df.stack().groupby(level=0).value_counts() - 1).sum(level=0)
df
A S D F E I Count
0 K1 K2 K1 R3 R1 K3 1
1 K2 K4 K4 R2 R2 R2 3
或者,使用insert
(如@Anton vBR所示),
df.insert(
0, 'Count', (df.stack().groupby(level=0).value_counts() - 1).sum(level=0)
)
df
Count A S D F E I
0 1 K1 K2 K1 R3 R1 K3
1 3 K2 K4 K4 R2 R2 R2