【问题标题】:Make new column in Panda dataframe by adding values from other columns通过添加来自其他列的值在 Panda 数据框中创建新列
【发布时间】:2016-03-05 13:59:50
【问题描述】:

我有一个数据框,其值类似于

A B
1 4
2 6
3 9

我需要通过添加 A 列和 B 列中的值来添加一个新列,例如

A B C
1 4 5
2 6 8
3 9 12

我相信这可以使用 lambda 函数来完成,但我不知道该怎么做。

【问题讨论】:

  • 你可以做df['C'] = df.sum(axis=1)

标签: python python-2.7 pandas


【解决方案1】:

很简单:

df['C'] = df['A'] + df['B']

【讨论】:

  • 我收到以下警告:试图在 DataFrame 中的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value
  • 运行 version 给我 '0.16.2'
  • 我收到与版本相同的警告:3.7.4(默认,2019 年 8 月 9 日,18:34:13)[MSC v.1915 64 位 (AMD64)]
  • 我在显示第四列时遇到问题。我已经有a,b,c 列。但是当我尝试计算b + c = d 的总和时,我得到了AttributeError: 'DataFrame' object has no attribute c。会有什么问题?
【解决方案2】:

最简单的方法是使用 DeepSpace 答案。但是,如果你真的想使用匿名函数,你可以使用 apply:

df['C'] = df.apply(lambda row: row['A'] + row['B'], axis=1)

【讨论】:

  • 知道如何支持变体列吗?
【解决方案3】:

您可以使用sum 函数来实现这一点,正如评论中提到的@EdChum:

df['C'] =  df[['A', 'B']].sum(axis=1)

In [245]: df
Out[245]: 
   A  B   C
0  1  4   5
1  2  6   8
2  3  9  12

【讨论】:

    【解决方案4】:

    从 Pandas 0.16.0 版开始,您可以使用assign,如下所示:

    df = pd.DataFrame({"A": [1,2,3], "B": [4,6,9]})
    df.assign(C = df.A + df.B)
    
    # Out[383]: 
    #    A  B   C
    # 0  1  4   5
    # 1  2  6   8
    # 2  3  9  12
    

    您可以按如下方式添加多个列:

    df.assign(C = df.A + df.B,
              Diff = df.B - df.A,
              Mult = df.A * df.B)
    # Out[379]: 
    #    A  B   C  Diff  Mult
    # 0  1  4   5     3     4
    # 1  2  6   8     4    12
    # 2  3  9  12     6    27
    

    【讨论】:

    • 此方法避免了@n00b 所说的警告。
    【解决方案5】:

    在 Anton 的回答基础上再增加一点,您可以像这样添加所有列:

    df['sum'] = df[list(df.columns)].sum(axis=1)
    

    【讨论】:

    • 我不敢相信这个答案没有多少赞成票。这是唯一一个您不需要单独输入列名来获得总和的地方!谢谢@sparrow!
    • 你可以放弃list(df.columns),因为它在这里是多余的。所以最终代码应该看起来像df['sum'] = df.sum(axis=1)
    【解决方案6】:

    你可以这样做:

    df['C'] = df.sum(axis=1)
    

    如果你只想做数值:

    df['C'] = df.sum(axis=1, numeric_only=True)
    

    参数axis 接受01 作为参数,0 表示跨列求和,1 跨行求和。

    【讨论】:

      【解决方案7】:

      我想添加一条评论来响应 n00b 收到的错误消息,但我没有足够的声誉。所以我的评论是一个答案,以防它帮助任何人......

      n00b 说:

      我收到以下警告:试图在 DataFrame 中的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value

      他收到此错误是因为他在创建 df['C'] 之前对他的数据框所做的任何操作都创建了数据框的视图,而不是它的副本。 DeepSpace 建议的简单计算df['C'] = df['A'] + df['B'] 不会出现错误。

      查看Returning a view versus a copy 文档。

      【讨论】:

        【解决方案8】:

        关于 n00b 的评论:“我收到以下警告:正在尝试在 DataFrame 的切片副本上设置值。尝试使用 .loc[row_indexer,col_indexer] = value 代替”

        我遇到了同样的错误。就我而言,这是因为我试图在这样创建的数据框上执行列添加:

        df_b = df[['colA', 'colB', 'colC']]
        

        代替:

        df_c = pd.DataFrame(df, columns=['colA', 'colB', 'colC'])
        

        df_b 是 df 切片的副本
        df_c 是一个新的数据框。所以

        df_c['colD'] = df['colA'] + df['colB']+ df['colC']
        

        将添加列并且不会引发任何警告。如果使用 .sum(axis=1) 则相同。

        【讨论】:

          【解决方案9】:

          可以使用loc

          In [37]:  df = pd.DataFrame({"A":[1,2,3],"B":[4,6,9]})
          
          In [38]: df
          Out[38]:
             A  B
          0  1  4
          1  2  6
          2  3  9
          
          In [39]: df['C']=df.loc[:,['A','B']].sum(axis=1)
          
          In [40]: df
          Out[40]:
             A  B   C
          0  1  4   5
          1  2  6   8
          2  3  9  12
          

          【讨论】:

            【解决方案10】:

            您可以通过简单地添加来解决它: df['C'] = df['A'] + df['B']

            【讨论】:

              猜你喜欢
              • 2019-04-04
              • 2020-06-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-29
              • 2021-10-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多