根据条件替换数据框列中的值

时间:2014-10-29 00:05:44

标签: python pandas dataframe

我有一项看似简单的任务。具有2列的数据帧:A和B.如果B中的值大于A中的值 - 将值替换为值A.我曾经通过执行df.B[df.B > df.A] = df.A来执行此操作,但最近升级的pandas开始提供{遇到此链式分配时{1}}。官方文档建议使用SettingWithCopyWarning

好的,我说过,并且是通过.loc完成的,并且一切正常,除非B栏的所有值都为df.loc[df.B > df.A, 'B'] = df.A。然后发生了一些奇怪的事情:

NaN

现在,即使B&B的元素中的一个满足条件(大于A),那么一切正常:

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

但如果没有Bs元素满足,那么所有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

-9223372036854775808

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

谢谢!

1 个答案:

答案 0 :(得分:8)

这是一个问题,固定here

由于pandas基本上允许在loc中的表达式的右侧设置任何内容,因此可能需要消除10个以上的情况需要消除歧义。给你一个想法:

df.loc[lhs, column] = rhs 

其中rhs可以是:list,array,scalar,而lhs可以是:slice,tuple,scalar,array

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

在这个特殊情况下,lhs是一个数组,所以我们通常会尝试将lhs强制转换为rhs的类型,但如果我们有一个不安全的转换(int - > float),这种情况会退化

可以说这是一个缺失的边缘案例。

相关问题