用另一个值替换某些列中的所有负值

时间:2018-05-03 06:34:36

标签: python pandas dataframe replace

假设我有四个连续排列的列作为数据框的一部分,我想将这4列中的所有负值替换为另一个值(-5让我们说),我该怎么办?

T1   T2  T3  T4
20   -5  4   3
85  -78  34  21
-45  22  31  75
-6   5   7  -28

从逻辑上讲,我希望这会奏效。但是,它没有。

for i in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4]<0:
    for j in df[i]:
        if j<0:
            j=-5

3 个答案:

答案 0 :(得分:2)

您可以通过应用条件声明来使用indexing

cols = ['T1','T2','T3','T4']
df[df[cols] < 0] = -5

输出

In [35]: df
Out[35]:
     T1  T2  T3  T4
  0  20  -5   4   3
  1  85  -5  34  21
  2  -5  22  31  75
  3  -5   5   7  -5

在您的示例中,您只是替换变量的值。您需要使用at方法替换一个单元格的值。

for i in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4]<0:
for index, j in enumerate(df[i]):
    if j<0:
        df.at[index, i] = -5

答案 1 :(得分:1)

对所有列使用mask

df = df.mask(df < 0, -5)

或者如果需要指定列:

cols = ['T1','T2','T3','T4']
df[cols] = df[cols].mask(df[cols] < 0, -5)
print (df)
   T1  T2  T3  T4
0  20  -5   4   3
1  85  -5  34  21
2  -5  22  31  75
3  -5   5   7  -5

采用类似的方法,选择有问题的位置:

pos = df.columns.get_loc("T1")
df.iloc[:,pos:pos+4] = df.iloc[:,pos:pos+4].mask(df < 0, -5)

编辑:

如果exist vectorized solution,建议不要在大熊猫中使用循环解决方案,因为速度很慢。

但有可能,您的代码应该随iterrowsiteritems而改变:

for i, row in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4].iterrows():
    for j,k in row.iteritems():
        if k < 0:
            df.loc[i, j] = -5
print (df)
   T1  T2  T3  T4
0  20  -5   4   3
1  85  -5  34  21
2  -5  22  31  75
3  -5   5   7  -5

答案 2 :(得分:1)

您可以使用索引:

c = ['T1','T2','T3','T4']
df[df[c] < 0] = -5

clip

In [47]: df[c].clip(lower=-5)
Out[47]:
   T1  T2  T3  T4
0  20  -5   4   3
1  85  -5  34  21
2  -5  22  31  75
3  -5   5   7  -5