2014-10-29 248 views
5

我有一个看似简单的任务。具有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 

这是一个错误或功能?我应该怎么做这个替换?

谢谢!

+1

绝对看起来像一个错误,可能是一个好主意,要报告[https://github.com/pydata/pandas/issues](https://github.com/pydata/pandas/issues) – Marius 2014-10-29 00:15:22

回答

7

这是一个buggie,固定here

由于熊猫基本上允许在loc的表达式的右侧设置任何东西,因此可能有10多个需要消歧的情况。为了给你一个想法:

df.loc[lhs, column] = rhs 

其中RHS可以是:list,array,scalar和LHS可能是:slice,tuple,scalar,array

和案件的一小部分,其中需要根据推断/设定所产生的列D型到rhs。 (这有点复杂)。例如,假设你没有设置lhs上的所有元素,它是整数,那么你需要强制浮动。但是,如果你确实设置了所有的元素并且rhs是一个整数,那么它需要被强制回到整数。

在此该特定情况下,在LHS是一个数组,所以我们通常将试图强制该LHS到RHS的类型,但这种情况下退化,如果我们有一个不安全的转换(INT - >浮动)

只需说这是一个缺失的边缘案例。

相关问题