【问题标题】:Python dataframe; trouble changing value of column with multiple filtersPython数据框;使用多个过滤器更改列的值时遇到问题
【发布时间】:2018-12-10 09:47:43
【问题描述】:

我有一个大型数据框,我从 ODBC 数据库中取出。 Dataframe 有多个列;我试图通过过滤另外两列来更改一列的值。 首先,我使用两个条件过滤我的数据框 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 库中的一个错误,不确定这是否是他们所说的。

我会重视您可能提出的任何意见,也会对解决此问题的替代方法感兴趣。我用“PRODUCT_NAME”作为输入的映射函数填充了“Reinsurer”列(有一个将所有“PRODUCT_NAME”值与“Reinsurer”值连接起来的字典)。

【问题讨论】:

  • 不,我从服务器上取出数据并创建 Excel 报告。
  • 我觉得很奇怪,我没有发现你的代码有任何逻辑错误。
  • 您的第一个示例.. 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) 是链式索引的一个明显示例。错误是正确的。始终使用loc
  • 您应该向minimal reproducible example 提供一些文本数据,以便我们可以通过loc 重现您的问题。
  • 好吧,这真的很奇怪。当我之前尝试使用.loc 函数时,我的写法与上面不同:data_prem[(data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))].loc[data_prem[(data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))],'Reinsurer'] = 'H' 基本上,我在过滤后的数据帧上使用了.loc。我之前把代码过于复杂(尽管我记得我也尝试过更简单的方法,但在尝试过于复杂的方法之前遇到了问题)。

标签: python pandas dataframe filter


【解决方案1】:

给定您的布尔值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'

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 2021-04-13
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多