我有一个类似以下的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,并且我认为自己是以正确的方式进行作业的。
答案 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会发出警告。