Python - Pandas - 计算字符串中字符出现的次数并替换字符串值

标签 python python-3.x pandas dataframe

已编辑:

我有以下数据框

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/

相关文章:

c++ - 函数指针是否在进程间保持有效?

Python 导入 - 解释

python - 与多处理队列作斗争

python - 根据名称删除数据框行

pandas - 如何提高pandas索引和设置值的速度

python - Pycharm/Windows 10 键盘快捷键冲突

python - wxPython Application.DoEvents() 等效?

python - 两个客户端使用redis-py同时访问REDIS

python - 使用Python从url下载HTML页面

python - 如何在未修复空格/s分隔的情况下读取pandas中的文件?