更改DataFrame行子集的列

时间:2018-07-13 06:50:29

标签: python string pandas dataframe

我有一个类似以下的DataFrame:

import pandas as pd
df = pd.DataFrame(data={'text':['foo', '10€', 'EUR5', 'bar'], 'x':[1.1, 2.2, 3.3, 4.4]})

    text    x
0   foo     1.1
1   10€     2.2
2   EUR5    3.3
3   bar     4.4

我通过以下方式使用正则表达式对其进行了子集设置:

df_amounts = df.loc[df.text.str.contains(r"(EUR|€)?\d+(EUR|€)?")]

    text    x
1   10€     2.2
2   EUR5    3.3

从现在开始,我只使用子集,而不关心原始df(我实际上不想更改它!)。这就引出了一个问题,我是否可以忽略执行以下操作时发生的警告(并可能将其关闭):

df_amounts.loc[:, 'text'] = df_amounts.text.str.strip("EUR€")

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

我已经读过documentation,并且我认为自己是以正确的方式进行作业的。

1 个答案:

答案 0 :(得分:1)

您需要copy

df_amounts = df.loc[df.text.str.contains(r"(EUR|€)?\d+(EUR|€)?")].copy()
df_amounts['text'] = df_amounts.text.str.strip("EUR€")
print (df_amounts)
  text    x
1   10  2.2
2    5  3.3

如果稍后在df_amounts中修改值,您会发现修改不会传播回原始数据(df),并且Pandas会发出警告。