【问题标题】:Python Pandas sum of dataframe with one columnPython Pandas 数据框总和与一列
【发布时间】:2015-07-31 23:25:27
【问题描述】:

我有一个 Python Pandas 数据框:

df = pd.DataFrame(np.random.rand(5,3),columns=list('ABC'))
print df
              A           B           C
0   0.041761178 0.60439116  0.349372206
1   0.820455992 0.245314299 0.635568504
2   0.517482167 0.7257227   0.982969949
3   0.208934899 0.594973111 0.671030326
4   0.651299752 0.617672419 0.948121305

问题: 我想将第一列添加到整个数据框中。我想得到这个:

              A           B           C
0   0.083522356 0.646152338 0.391133384
1   1.640911984 1.065770291 1.456024496
2   1.034964334 1.243204867 1.500452116
3   0.417869798 0.80390801  0.879965225
4   1.302599505 1.268972171 1.599421057

对于第一行:

  • 答:0.04176 + 0.04176 = 0.08352
  • B:0.04176 + 0.60439 = 0.64615

要求: 我无法使用其列名引用第一列。 例如:df.A 不可接受; df.iloc[:,0] 可以接受。

尝试: 我试过这个:

print df.add(df.iloc[:,0], fill_value=0)

但它不起作用。它返回错误消息:

Traceback (most recent call last):
  File "C:test.py", line 20, in <module>
    print df.add(df.iloc[:,0], fill_value=0)
  File "C:\python27\lib\site-packages\pandas\core\ops.py", line 771, in f
    return self._combine_series(other, na_op, fill_value, axis, level)
  File "C:\python27\lib\site-packages\pandas\core\frame.py", line 2939, in _combine_series
    return self._combine_match_columns(other, func, level=level, fill_value=fill_value)
  File "C:\python27\lib\site-packages\pandas\core\frame.py", line 2975, in _combine_match_columns
    fill_value)
NotImplementedError: fill_value 0 not supported

是否可以将 DataFrame 的所有列与第一列相加?

【问题讨论】:

    标签: python python-2.7 pandas dataframe sum


    【解决方案1】:

    这就是你需要做的:

    df.add(df.A, axis=0)
    
    
    Example:
    >>> df = pd.DataFrame(np.random.rand(5,3),columns=['A','B','C'])
    >>> col_0 = df.columns.tolist()[0]
    
    >>> print df
              A         B         C
    0  0.502962  0.093555  0.854267
    1  0.165805  0.263960  0.353374
    2  0.386777  0.143079  0.063389
    3  0.639575  0.269359  0.681811
    4  0.874487  0.992425  0.660696
    >>> df = df.add(df.col_0, axis=0)
    >>> print df
              A         B         C
    0  1.005925  0.596517  1.357229
    1  0.331611  0.429766  0.519179
    2  0.773553  0.529855  0.450165
    3  1.279151  0.908934  1.321386
    4  1.748975  1.866912  1.535183
    >>> 
    

    【讨论】:

    • 您的答案有正确的方法,但我无法按名称命名列。
    • 我更新了答案。如果您需要,请不要忘记批准答案。
    • 谢谢。这个帖子已经解决了。我所有的问题都在这里得到解答。
    【解决方案2】:

    我会尝试这样的:

    firstol = df.columns[0]
    df2 = df.add(df[firstcol], axis=0)
    

    【讨论】:

      【解决方案3】:

      我结合以上两个帖子来回答这个问题。

      由于我无法通过名称引用特定列,因此我无法使用df.add(df.A, axis=0)。但这是正确的。由于df += df[firstcol] 生成了NaNs 的数据框,因此我无法使用这种方法,但是该解决方案从数据框中获取列列表的方式是我需要的技巧。

      我是这样做的:

      col_0 = df.columns.tolist()[0]
      print(df.add(df[col_0], axis=0))
      

      【讨论】:

        【解决方案4】:

        您可以为此使用numpy 和广播:

        df = pd.DataFrame(df.values + df['A'].values[:, None],
                          columns=df.columns)
        

        我希望这比基于系列的方法更有效。

        【讨论】:

          猜你喜欢
          • 2020-08-02
          • 1970-01-01
          • 2019-01-08
          • 2018-07-08
          • 1970-01-01
          • 2019-02-04
          • 2019-11-11
          • 2021-09-22
          • 1970-01-01
          相关资源
          最近更新 更多