假设我有一个这样的数据框,第一列为“密集”,第二列为“稀疏”:
# python 3.7.1, pandas 0.23.4.
import pandas as pd
df = pd.DataFrame({'col1':range(1,5), 'col2': [5, '', 7, '']})
missing_values_index = df[df['col2'] == ''].index
我尝试了两种方法将 col1 值分配给 col2 缺失值。
方法1(无效,df保持不变):
df.loc[missing_values_index]['col2'] = df.loc[missing_values_index]['col1']
方法2(正常):
df.loc[missing_values_index, 'col2'] = df.loc[missing_values_index, 'col1']
我认为这些只是写同一件事的两种方式。有人可以解释一下这里到底发生了什么吗?
答案 0 :(得分:0)
您提到的第二种方法“可以正常工作”,所以让我们来谈谈为什么第一种方法不起作用!
我认为问题的核心是当我们尝试为对象的副本而不是对象本身分配值时。我可以这样重写您的第一个方法:
something = df.loc[missing_values_index]
something['col2'] = df.loc[missing_values_index]['col1']
现在是问题显现出来的时候。根据{{3}},未知是第一行创建了view
或copy
。这就是为什么它会引发SettingWithCopy
警告并阻止您进行分配的原因;因为如果Pandas无法确定您的作业是否有效,就不能让您这样做!