如何替换后列定义的 pandas 数据框列中的可变子字符串?
How to replace variable substrings across a pandas dataframe column that are defined by the column after?
我有一个大型 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
中的相同数字低于阈值,我想用高于阈值的随机整数替换 col1
中的 Chrome 版本号。请注意,如果满足阈值,col2
就是 None
。
我知道在这种情况下,我需要 df.apply
和 axis = 1
才能同时访问两个列值。
然而,当我这样做时:
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 数据框列中由后面的列定义的变量子字符串?
对我不起作用的解决方案(原因):
(太慢了)
(不适用于可变子串)
完全没有必要apply
。将 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
我有一个大型 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
中的相同数字低于阈值,我想用高于阈值的随机整数替换 col1
中的 Chrome 版本号。请注意,如果满足阈值,col2
就是 None
。
我知道在这种情况下,我需要 df.apply
和 axis = 1
才能同时访问两个列值。
然而,当我这样做时:
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 数据框列中由后面的列定义的变量子字符串?
对我不起作用的解决方案(原因):
完全没有必要apply
。将 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