我有一个看似简单的任务。具有2列的数据框:A和B.如果B中的值大于A中的值 - 将这些值替换为A的值。我曾经通过做df.B[df.B > df.A] = df.A
来做到这一点,但是最近的熊猫升级在遇到这种链接时开始给出SettingWithCopyWarning
分配。官方文件建议使用.loc
。根据条件替换数据帧列中的值
好的,我说,并通过df.loc[df.B > df.A, 'B'] = df.A
做到了,它一切正常,除非B列的所有值为NaN
。然后奇怪的事情发生了:
In [1]: df = pd.DataFrame({'A': [1, 2, 3],'B': [np.NaN, np.NaN, np.NaN]})
In [2]: df
Out[2]:
A B
0 1 NaN
1 2 NaN
2 3 NaN
In [3]: df.loc[df.B > df.A, 'B'] = df.A
In [4]: df
Out[4]:
A B
0 1 -9223372036854775808
1 2 -9223372036854775808
2 3 -9223372036854775808
现在,如果B的元素,甚至一个满足条件(大于A),然后这一切工作正常:
In [1]: df = pd.DataFrame({'A': [1, 2, 3],'B': [np.NaN, 4, np.NaN]})
In [2]: df
Out[2]:
A B
0 1 NaN
1 2 4
2 3 NaN
In [3]: df.loc[df.B > df.A, 'B'] = df.A
In [4]: df
Out[4]:
A B
0 1 NaN
1 2 2
2 3 NaN
但是,如果没有烧烤元素的满足,那么所有NaN
小号GET替换-9223372036854775808
:
In [1]: df = pd.DataFrame({'A':[1,2,3],'B':[np.NaN,1,np.NaN]})
In [2]: df
Out[2]:
A B
0 1 NaN
1 2 1
2 3 NaN
In [3]: df.loc[df.B > df.A, 'B'] = df.A
In [4]: df
Out[4]:
A B
0 1 -9223372036854775808
1 2 1
2 3 -9223372036854775808
这是一个错误或功能?我应该怎么做这个替换?
谢谢!
绝对看起来像一个错误,可能是一个好主意,要报告[https://github.com/pydata/pandas/issues](https://github.com/pydata/pandas/issues) – Marius 2014-10-29 00:15:22