【发布时间】: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 警告我,我正在尝试修改数据帧的副本,尽管我明确引用了原始数据帧(我发布图片以便您查看我的结果)。
我也尝试过以下方式使用 .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