python - 如何替换 pandas 数据框列中由后面的列定义的变量子字符串?

标签 python string pandas str-replace

我有一个大型 pandas 数据框 df1,其中包含 col1 中的整个用户代理以及 col2 中包含的 Chrome 版本 (col2 是根据应用于 col1 的正则表达式模式生成的。

col1, col2
Mozilla/5.0 (X11; Linux x86_64) Chrome/14.0.2785.89 Safari/537.36, Chrome/14
Mozilla/5.0 (X11; Linux x86_64) Chrome/15.0.2743.98 Safari/537.36, Chrome/15
Mozilla/5.0 (X11; Linux x86_64) Chrome/22 Safari/537.36, None

如果 col2 中的 Chrome 版本号低于阈值,我想将 col1 中的 Chrome 版本号替换为高于阈值的随机整数。请注意,如果满足阈值,则 col2None

我知道在这种情况下,我需要使用 axis = 1 进行 df.apply 以便同时访问两个列值。

但是,当我这样做时:

df1.loc[(df1.col2 is not None), 'col1'] = 
         df1.apply(lambda x: x['col1'].replace(x['col2'], randint(20, 60)), axis=1)

我产量:

TypeError: ('expected a string or other character buffer object', u'occurred at index 0')

如何替换 pandas 数据框列中由后面的列定义的变量子字符串?

对我不起作用的解决方案(原因):
Python Pandas removing substring using another column (太慢)
replace substring in pandas data frame column (不适用于可变子串)

最佳答案

完全不需要申请。将 str.replace 与回调一起使用:

from random import randint

m = df.col2.notna()
df.loc[m, 'col1'] = df.loc[m, 'col1'].str.replace(
     r'(?<=Chrome/).*?(?=\s)', lambda x: str(randint(20, 60))
)

df
                                                col1       col2
0  Mozilla/5.0 (X11; Linux x86_64) Chrome/51 Safa...  Chrome/14
1  Mozilla/5.0 (X11; Linux x86_64) Chrome/26 Safa...  Chrome/15
2  Mozilla/5.0 (X11; Linux x86_64) Chrome/22 Safa...       None

关于python - 如何替换 pandas 数据框列中由后面的列定义的变量子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49248658/

相关文章:

c# - 格式化组合框的文本,C#

python - 使用m1芯片在mac上安装python表

python - Pandas Dataframe.to_csv 十进制 =',' 不起作用

python - 如何将 DataFrame 分类到 bin 中,保留每个 bin 的名称?

python - Django ORM 查询限制特定键实例

java - 需要在非负整数的二进制表示的子串中找到奇数个1

python - 使用 Python 在机器学习中预处理数据的不同方法?

java - 错误 : No resource found that matches the given name (at 'title' with value '@string/menu_settings' )

python - 通过索引访问 coo_matrix 时出现类型错误

Python3 - 将字典嵌套到 JSON