熊猫如何能够取代'在' loc'之后工作?

时间:2018-01-18 06:19:18

标签: python pandas

我已经尝试了很多次,但似乎更换了#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'之后使用正则表达式?

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

非常感谢你的帮助!

3 个答案:

答案 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