熊猫如何在“loc”之后“替换”工作?

新手上路,请多包涵

我已经尝试了很多次,但似乎在使用“loc”后“replace”无法正常工作。例如,我想将“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”之后用正则表达式“替换”吗?

或者你们还有其他一些好的解决方案?

非常感谢你的帮助!

原文由 Jonathan Zhou 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 366
2 个回答

我认为你需要在双方进行过滤:

 m = df['conlumn_a'] == 'apple'
df.loc[m,'conlumn_b'] = df.loc[m,'conlumn_b'].astype(str).replace(r'^(11+)','XXX',regex=True)
print (df)
  conlumn_a conlumn_b
0     apple       123
1    banana        11
2     apple       XXX
3    orange        33

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

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)

虽然,这会将您的列转换为对象列。

原文由 cs95 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题