Python数据框;麻烦通过多个过滤器更改列的值

时间:2018-12-10 09:47:44

标签: python pandas dataframe filter

我有一个很大的数据框,我取下了ODBC数据库。数据框具有多个列;我正在尝试通过过滤另外两列来更改一列的值。 首先,我用两种条件过滤数据框data_prem,这给了我正确的行:

data_prem[(data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))]

然后我在选择项上使用替换功能将'M'值更改为'H'值:

data_prem[(data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))]['Reinsurer'].replace(to_replace='M',value='H',inplace=True,regex=True)

Python警告我,尽管我清楚地引用了原始数据框,但我仍在尝试修改数据框的副本(我正在发布图像,以便您可以看到我的结果)。

dataframe filtering

我还尝试通过以下方式使用.loc函数:

data_prem.loc[((data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))),'Reinsurer'] = 'H'

更改了所有符合第二个条件的行(str.contains ...),但未应用第一个条件。我在“再保险商”列中也替换了其他“ PRODUCT_NAME”值。

一段时间以来,我一直在网上寻找答案。我已经在pandas库中看到一些bug的提法,不确定这是否是他们在说的。

我会珍惜您的任何意见,也可能会以其他方式解决此问题,这很有趣。我用带有“ PRODUCT_NAME”作为输入的地图函数填充了“ Reinsurer”列(有一个字典将所有“ PRODUCT_NAME”值与“ Reinsurer”值连接在一起)。

1 个答案:

答案 0 :(得分:0)

鉴于布尔值mask,您已经演示了两种应用chained indexing的方式。这是警告的原因,也是为什么您未按预期看到逻辑被应用的原因。

mask = (data_prem['PRODUCT_NAME']=='ŽZ08') & df['BENEFIT'].str.contains('19.08.16')

链式索引:示例#1

df[mask]['Reinsurer'].replace(to_replace='M', value='H', inplace=True, regex=True)

链式索引:示例#2

df[mask].loc[mask, 'Reinsurer'] = 'H'

避免链接索引

通过一次应用mask并使用一个loc调用,可以使事情变得简单:

df.loc[mask, 'Reinsurer'] = 'H'