我已经尝试了很多次,但似乎更换了#39;使用后无法正常使用' loc'。 例如,我想替换' conlumn_b'正如行的正则表达式那样,' conlumn_a'价值是' apple'。
以下是我的示例代码:
df.loc[df['conlumn_a'] == 'apple', 'conlumn_b'].replace(r'^11*', 'XXX',inplace=True, regex=True)
示例:
conlumn_a conlumn_b
apple 123
banana 11
apple 11
orange 33
我期望的结果是' df'是:
conlumn_a conlumn_b
apple 123
banana 11
apple XXX
orange 33
任何人都遇到了这个需要“替换”的问题。在' loc'之后使用正则表达式?
或者你们有其他一些好的解决方案吗?
非常感谢你的帮助!
答案 0 :(得分:5)
inplace=True
适用于应用于的对象。
当您致电.loc
时,您正在切割数据框对象以返回新对象。
>>> id(df)
4587248608
而且,
>>> id(df.loc[df['conlumn_a'] == 'apple', 'conlumn_b'])
4767716968
现在,在此新切片上调用就地replace
将应用替换操作,更新新切片本身,而不是原始切片。
现在,请注意您在 replace
列上调用int
,并且不会发生任何事情,因为正则表达式适用于字符串。
以下是我为您提供的解决方法。根本不要使用正则表达式。
m = df['conlumn_a'] == 'apple'
df.loc[m, 'conlumn_b'] = df.loc[m, 'conlumn_b'].replace(11, 'XXX')
df
conlumn_a conlumn_b
0 apple 123
1 banana 11
2 apple XXX
3 orange 33
或者,如果需要基于正则表达式的替换,那么 -
df.loc[m, 'conlumn_b'] = df.loc[m, 'conlumn_b']\
.astype(str).replace('^11$', 'XXX', regex=True)
尽管如此,这会将您的列转换为对象列。
答案 1 :(得分:3)
我要从recent answer of mine借钱。此技术是用于更新数据帧的通用策略:
df.update(
df.loc[df['conlumn_a'] == 'apple', 'conlumn_b']
.replace(r'^11$', 'XXX', regex=True)
)
df
conlumn_a conlumn_b
0 apple 123
1 banana 11
2 apple XXX
3 orange 33
请注意,我所做的只是移除inplace=True
,而是将其包裹在pd.DataFrame.update
方法中。
答案 2 :(得分:2)
我认为你需要双方过滤:
batchUpdate