在Pandas中将特定列中的所有负值替换为另一个值

6
假设我有一个数据框中连续排列的四列,我想用另一个值(比如-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个回答

5
您可以通过应用条件语句来使用索引。
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

我编辑了我的问题。我的数据框有200多列,我只想编辑连续排列的4/5列。 - hegdep
谢谢!这真的很简单!只是想知道,为什么我按照我写的方式它不起作用? - hegdep
@hegdep,因为在你的示例中你只是替换了变量的值。你可以使用at方法来更新单元格的值。请查看更新后的答案。 - Mihai Alexandru-Ionut

3

使用 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)

编辑:

在 pandas 中,如果存在向量化的解决方案,不建议使用循环,因为速度较慢。

但是有可能需要使用循环,你的代码应该改成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
您可以使用索引:
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

我编辑了我的问题。我的数据框有200多列,我只想编辑连续排列的4/5列。 - hegdep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接