如何根据条件将pandas数据帧中某个范围内的值替换为同一数据帧中的另一个值

时间:2016-02-20 23:01:30

标签: python numpy pandas

如果范围中的值大于零,我想替换数据框中列范围内的值与另一列中的对应值。

我认为像这样的简单替换会起作用:

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],})

1 个答案:

答案 0 :(得分:1)

不知道如何在Pandas本身中做到这一点,但如果你下降到numpy并不是那么困难。

如果你足够幸运,以便你的整个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.wherenumpy的三元条件。
  • np.logical_ornumpy或。
  • np.isnan检查值是否为nan
  • np.tile个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中不赞成),但至少它是通过列而不是行来实现的。假设您的数据比较宽,那应该没问题。

相关问题