【问题标题】:How do I perform a math operation on a Python Pandas dataframe column, but only if a certain condition is met?如何对 Python Pandas 数据框列执行数学运算,但前提是满足特定条件?
【发布时间】:2017-01-08 15:38:17
【问题描述】:

我有一个正在使用的 Pandas 数据框,我只需将某个列中大于 800 的所有值除以 100。换句话说,如果“credit_score”列中的值大于800,可以假设输入的数据在小数点左侧多出两位。比如……

id    credit_score    column_b    column_c
0     750             ...         ...
1     653             ...         ...
2     741             ...         ...
3     65100           ...         ...
4     73500           ...         ...
5     565             ...         ...
6     480             ...         ...
7     78900           ...         ...
8     699             ...         ...
9     71500           ...         ...

所以我基本上想将行索引 3、4、7 和 9 的信用评分除以 100,而不是其他的。我希望新的有效值替换旧的无效值。或者,也可以使用诸如“credit_score_fixed”之类的新列。我对 Python 和 Pandas 还很陌生,因此非常感谢任何帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用mask:

    df.credit_score = df.credit_score.mask( df.credit_score > 800, df.credit_score/ 100)
    

    numpy.where:

    df.credit_score = np.where( df.credit_score > 800, df.credit_score/ 100, df.credit_score)
    
    print (df)
       id  credit_score    col   col1
    0   0           750  750.0  750.0
    1   1           653  653.0  653.0
    2   2           741  741.0  741.0
    3   3         65100  651.0  651.0
    4   4         73500  735.0  735.0
    5   5           565  565.0  565.0
    6   6           480  480.0  480.0
    7   7         78900  789.0  789.0
    8   8           699  699.0  699.0
    9   9         71500  715.0  715.0
    

    【讨论】:

    • 对我来说,“面具”是最直观的解决方案,而且效果很好。谢谢!
    【解决方案2】:

    您可以使用Series.apply。它接受一个函数并将其应用于系列中的每个元素。请注意,它不是就地的,您需要将它返回的系列重新分配给新列或同一列。

    def fix_scores(score):
        return score / 100 if score > 800 else score
        # same as
        # if score > 800:
        #      return score / 100
        # return score
    
    df['credit_score_fixed'] = df['credit_score'].apply(fix_scores)
    

    【讨论】:

    • 工作就像一个魅力。谢谢!
    【解决方案3】:

    我会使用Pandas boolean indexing:

    In [193]: df.loc[df.credit_score > 800, 'credit_score'] /= 100
    
    In [194]: df
    Out[194]:
        credit_score
    id
    0          750.0
    1          653.0
    2          741.0
    3          651.0
    4          735.0
    5          565.0
    6          480.0
    7          789.0
    8          699.0
    9          715.0
    

    【讨论】:

    • 效果很好,谢谢!您能否为我澄清一下“/=”的作用(而不是仅使用“/”)?
    • @ScottP, a /= 2 等于 a = a / 2
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2021-12-21
    • 2016-05-09
    • 2017-04-30
    相关资源
    最近更新 更多