【问题标题】:Replacing all negative values in certain columns by another value in Pandas用 Pandas 中的另一个值替换某些列中的所有负值
【发布时间】:2018-10-13 08:58:35
【问题描述】:

假设我有四个连续排列的列作为数据框的一部分,我想将这 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

【问题讨论】:

    标签: python pandas dataframe replace


    【解决方案1】:

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

    【讨论】:

    • 我编辑了我的问题。我的数据框有 200 多列,我只想编辑连续排列的 4/5 列。
    • 谢谢!这真的很简单!不过,只是想知道。为什么我按原来的方式写出来就不行了?
    • @hegdep,因为在您的示例中,您只需替换变量的值。您可以使用at 方法来更新单元格值。看看更新的答案。
    【解决方案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 列。
    【解决方案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 中循环解决方案,如果 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2022-07-25
      • 2016-02-04
      • 2019-07-16
      • 1970-01-01
      相关资源
      最近更新 更多