如果范围中的值大于零,我想用另一列中的相应值替换数据框的列范围内的值。
我认为这样的简单替换将起作用:
df = df.loc[:,'A':'D'].replace(1, df['column_with_value_I_want'])
但是,实际上,除了删除
column_with_value_I_want
完全是意料之外的,据我所知,它什么也没做,我不确定为什么会这样。这似乎也不起作用:
df[df.loc[:,'A':'D']] > 0 = df['column_with_value_I_want']
它返回错误:
SyntaxError: can't assign to comparison
。这似乎应该很简单,但是在尝试了几种不同的方法却无济于事之后,我感到茫然。
我正在使用的数据框看起来像这样:
df = pd.DataFrame({'A' : [1,0,0,1,0,0],
'B' : [1,0,0,1,0,1],
'C' : [1,0,0,1,0,1],
'D' : [1,0,0,1,0,0],
'column_with_value_I_want' : [22.0,15.0,90.0,10.,None,557.0],})
最佳答案
不知道如何在Pandas本身中做到这一点,但是如果您变得麻木不那么困难。
如果您很幸运地使您的整个DataFrame都是数字形式的,则可以执行以下操作:
import numpy as np
m = df.as_matrix()
>>> pd.DataFrame(
np.where(np.logical_or(np.isnan(m), m > 0), np.tile(m[:, [4]], 5), m),
columns=df.columns)
A B C D column_with_value_I_want
0 22 22 22 22 22
1 0 0 0 0 15
2 0 0 0 0 90
3 10 10 10 10 10
4 0 0 0 0 NaN
5 0 557 557 0 557
as_matrix
将DataFrame转换为numpy array
。np.where
是numpy
的三元条件。np.logical_or
是numpy
的或。np.isnan
是检查值是否不是nan
。np.tile
(在这种情况下)将2d单列平铺到矩阵。不幸的是,如果您的某些列(即使是那些未参与此操作的列)本质上是非数字的,则上述操作将失败。在这种情况下,您可以执行以下操作:
for col in ['A', 'B', 'C', 'D']:
df[col] = np.where(df[col] > 0, df[col], df.column_with_value_I_want)
只要5个相关的列都是数字,它就会起作用。
这使用了一个循环(在数字Python中是不喜欢的),但至少它是在列而不是行上使用的。假设您的数据长于宽,那么就可以了。