首页 文章

Python数据帧;无法使用多个过滤器更改列的值

提问于
浏览
1

我有一个大型数据帧,我从ODBC数据库中取出 . Dataframe有多个列;我试图通过过滤另外两个来更改一列的值 . 首先,我使用两个条件过滤我的dataframe data_prem,这些条件为我提供了正确的行:

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

然后我在选择上使用replace函数将'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”值的替代品 .

我已经在网上搜索了一段时间的答案 . 我在熊猫图书馆看到了一些提到的错误,不确定这是不是他们在说什么 .

我会重视你可能有的任何意见,在解决这个问题的其他方法上也会很有意思 . 我在“再保险人”列中添加了 Map 功能,其中“PRODUCT_NAME”作为输入(有一个字典,将所有'PRODUCT_NAME'值与'再保险'值相关联) .

1 回答

  • 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'
    

相关问题