【问题标题】:Subtract two columns in dataframe减去数据框中的两列
【发布时间】:2018-06-29 06:29:03
【问题描述】:

我的 df 如下所示:

Index    Country    Val1  Val2 ... Val10
1        Australia  1     3    ... 5
2        Bambua     12    33   ... 56
3        Tambua     14    34   ... 58

我想从每个国家/地区的 Val1 中减去 Val10,所以输出如下所示:

Country    Val10-Val1
Australia  4
Bambua     23
Tambua     24

到目前为止,我得到了:

def myDelta(row):
    data = row[['Val10', 'Val1']]
    return pd.Series({'Delta': np.subtract(data)})

def runDeltas():
    myDF = getDF() \
        .apply(myDelta, axis=1) \
        .sort_values(by=['Delta'], ascending=False)
    return myDF

runDeltas 导致此错误:

ValueError: ('invalid number of arguments', u'occurred at index 9')

解决这个问题的正确方法是什么?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    给定以下数据框:

    df = pd.DataFrame([["Australia", 1, 3, 5],
                       ["Bambua", 12, 33, 56],
                       ["Tambua", 14, 34, 58]
                      ], columns=["Country", "Val1", "Val2", "Val10"]
                     )
    

    归结为一个简单的broadcasting operation

    >>> df["Val1"] - df["Val10"]
    0    -4
    1   -44
    2   -44
    dtype: int64
    

    【讨论】:

      【解决方案2】:

      使用这个作为df:

      df = pd.DataFrame([["Australia", 1, 3, 5],
                     ["Bambua", 12, 33, 56],
                     ["Tambua", 14, 34, 58]
                    ], columns=["Country", "Val1", "Val2", "Val10"]
                   )
      

      您也可以进行减法并将其放入新列中,如下所示。

      >>>df['Val_Diff'] = df['Val10'] - df['Val1']
      
          Country     Val1    Val2  Val10 Val_Diff
      0   Australia   1       3      5    4
      1   Bambua      12      33     56   44
      2   Tambua      14      34     58   44
      

      【讨论】:

        【解决方案3】:

        我今天所面临的,让我雄心勃勃地与你分享。如上所述,您可以轻松使用:

        df['Val10-Val1'] = df['Val10']-df['Val1']
        

        但有时您可能需要使用 apply 功能,因此您可以使用以下行:

        df['Val10-Val1'] = df.apply(lambda row: row['Val10']-row['Val1'])
        

        【讨论】:

        • 小心!您的代码df['Val10-Val1'] = df.apply(lambda row: row['Val10']-row['Val1']) 将产生KeyError: ('Val10', 'occurred at index Country'),因为您没有正确指定轴。功能代码如下:df['Val10-Val1'] = df.apply(lambda row: row['Val10'] - row['Val1'], axis=1).
        【解决方案4】:

        你也可以使用pandas.DataFrame.assign函数:e,g

        import numpy as np
        import pandas as pd
        
        df = pd.DataFrame([["Australia", 1, 3, 5],
                           ["Bambua", 12, 33, 56],
                           ["Tambua", 14, 34, 58]
                          ], columns=["Country", "Val1", "Val2", "Val10"]
                         )
        
        df = df.assign(Val10_minus_Val1 = df['Val10'] - df['Val1'])
        

        assign 最好的部分是您可以添加任意数量的作业。例如得到两者的差异,然后得到它的日志

        df = df.assign(Val10_minus_Val1 = df['Val10'] - df['Val1'], log_result = lambda x: np.log(x.Val10_minus_Val1) )
        

        结果:

        【讨论】:

          【解决方案5】:

          您可以通过使用 lambda 函数并分配给新列来做到这一点。

          df['Val10-Val1'] = df.apply(lambda x: x['Val10'] - x['Val1'], axis=1)
          print df
          

          【讨论】:

          • 注意:Pandas 系列上的矢量化(例如 df[col2]-df[col1])通常比使用 DataFrame apply with axis=1 具有更好的性能。
          【解决方案6】:

          虽然这是一个老问题,但 pandas 允许使用 pandas.DataFrame.subtract 减去两个 DataFrames 或 Seriess

          import pandas as pd
          
          df = pd.DataFrame([["Australia", 1, 3, 5],
                             ["Bambua", 12, 33, 56],
                             ["Tambua", 14, 34, 58]
                            ], columns=["Country", "Val1", "Val2", "Val10"]
                           )
          
          
          df["Val1"].subtract(df["Val2"])
          

          输出:

          0    -2
          1   -21
          2   -20
          dtype: int64
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-07
            • 2022-01-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多