【问题标题】:Conditional transformation of column in pandas Dataframepandas Dataframe中列的条件转换
【发布时间】:2018-07-30 20:53:15
【问题描述】:

我想在我的数据框中创建一个新列,如果该行中的第三列满足特定条件,则该列是两个变量之间的差异。

一个小例子如下所示:

 dict1 = [{'var0': 0, 'var1': 1, 'var2': 2},
 {'var0': 0, 'var1': 2, 'var2': 4},
{'var0': 1, 'var1': 5, 'var2': 8},
{'var0': 1, 'var1': 15, 'var2': 12},]
df = pd.DataFrame(dict1, index=['s1', 's2','s3','s4'])

特别是我想要 var0 和 var1 (var0-var1) 之间的差异,对于 var 2 大于 3 的所有行,否则我想要 var0 和 var2 (var0-var2) 之间的差异

我的目标输出是:

     var0  var1  var2 var3
 s1     0     1     2  -2
 s2     0     2     4  -2
 s3     1     5     8  -4
 s4     1    15    12  -14

【问题讨论】:

    标签: python pandas conditional-formatting


    【解决方案1】:

    一行就可以搞定

    import numpy as np
    
    df['var3'] = np.where( df.var2 > 3, df['var0'] - df['var1'], df['var0'] - df['var2'])
    

    【讨论】:

      【解决方案2】:

      这可能会解决问题

      constraint = (df['var2'] < 3)
      df.loc[constraint, 'var3'] = df['var0'] - df['var1']
      df.loc[~constraint, 'var3'] = df['var0'] - df['var2']
      

      【讨论】:

      • 很不错很简单,我喜欢。
      【解决方案3】:

      这可能会很慢,但应该可以解决问题。

      df['var3'] = 0
      for i in df.itertuples():
          if i.var2 > 3:
              amt = i.var0 - i.var1
              df.loc[i.Index,'var3'] = amt
          else:
              amt = i.var0 - i.var2
              df.loc[i.Index,'var3'] = amt
      

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 1970-01-01
        • 2017-03-01
        • 2018-12-17
        • 2015-10-09
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 2018-09-26
        相关资源
        最近更新 更多