已编辑:
我有以下数据框
Name Code
Cedric AMMMM
Joe A
Mickael AMMCX
Dupond MMMMMMM
Jean AMMMCMC
我想计算代码 列值的字符出现次数。并用字符和出现次数的串联替换该值。
我的预期结果如下:
Name Code
Cedric 1A4M
Joe 1A
Mickael 1A2M1C1X
Dupond 7M
Jean 1A3M1C1M1C
我试过以下方法:
for index, row in df.iterrows():
for i in "".join(set(row.Code)):
num = test.count(i)
df.loc[index,"Code"] = val + str(num) + i
但实际上我有一个超过 800 000 行的巨大数据框。当我执行这段代码时,这个过程太长了。
我正在寻找更好的解决方案来做到这一点。
已编辑:我在我的数据框中添加了最后一个示例。以前的回复不处理这个例子。我想处理这个用例
感谢您的帮助。
最佳答案
使用 f-string
的列表推导适用于 python 3.6+
并添加 sorted
按索引不改变顺序:
df['Code'] = [''.join(f'{x.count(i)}{i}' for i in sorted(set(x),key=x.index)) for x in df['Code']]
或者使用Counter
:
from collections import Counter
df['Code'] = [''.join(f'{j}{i}' for i, j in Counter(x).items()) for x in df['Code']]
print (df)
Name Code
0 Cedric 1A4M
1 Joe 1A
2 Mickael 1A2M1C1X
3 Dupond 7M
性能:
#[40000 rows x 2 columns]
df = pd.concat([df] * 10000, ignore_index=True)
In [119]: %timeit df['Code'] = [''.join(f'{j}{i}' for i, j in Counter(x).items()) for x in df['Code']]
276 ms ± 9.97 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [120]: %timeit df['Code'] = [''.join(f'{x.count(i)}{i}' for i in sorted(set(x),key=x.index)) for x in df['Code']]
262 ms ± 3.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
#U9-Forward solution
In [124]: %timeit df['Code']=df['Code'].apply(lambda x: ''.join([''.join(map(str,i)) for i in Counter(x).items()]))
339 ms ± 51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
关于Python - Pandas - 计算字符串中字符出现的次数并替换字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53608142/