Python 将DataFrame的列设置为数据框中其他列的总和

Python 将DataFrame的列设置为数据框中其他列的总和,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个如下所示的数据框,称之为“值”: 我想创建另一个,称之为“sums”,它包含从“sums”列到末尾的数据帧“值”的总和。如下所示: 我想创建这个,而不必查看整个数据帧,逐个数据点。我一直在尝试使用.apply(),如下所示,但我一直遇到错误:不支持+:'int'和'datetime.date'的操作数类型。 In [26]: values = pandas.DataFrame({0:[96,54,27,28], 1:[55,75,32,37],2:[54,

我有一个如下所示的数据框,称之为“值”:

我想创建另一个,称之为“sums”,它包含从“sums”列到末尾的数据帧“值”的总和。如下所示:

我想创建这个,而不必查看整个数据帧,逐个数据点。我一直在尝试使用
.apply()
,如下所示,但我一直遇到错误:
不支持+:'int'和'datetime.date'的操作数类型。

In [26]: values = pandas.DataFrame({0:[96,54,27,28],
              1:[55,75,32,37],2:[54,99,36,46],3:[35,77,0,10],4:[62,25,0,25],
              5:[0,66,0,89],6:[0,66,0,89],7:[0,0,0,0],8:[0,0,0,0]})

In [28]: sums = values.copy()

In [29]: sums.iloc[:,:] = ''         

In [31]: for column in sums:
    ...:     sums[column].apply(sum(values.loc[:,column:]))
    ...:     
Traceback (most recent call last):

  File "<ipython-input-31-030442e5005e>", line 2, in <module>
    sums[column].apply(sum(values.loc[:,column:]))
  File "C:\WinPython64bit\python-3.5.2.amd64\lib\site-packages\pandas\core\series.py", line 2220, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas\src\inference.pyx", line 1088, in pandas.lib.map_infer (pandas\lib.c:63043)

TypeError: 'numpy.int64' object is not callable


In [32]: for column in sums:
    ...:     sums[column] = sum(values.loc[:,column:])

In [33]: sums
Out[33]: 
    0   1   2   3   4   5   6   7  8
0  36  36  35  33  30  26  21  15  8
1  36  36  35  33  30  26  21  15  8
2  36  36  35  33  30  26  21  15  8
3  36  36  35  33  30  26  21  15  8
[26]中的
:value=pandas.DataFrame({0:[96,54,27,28],
1:[55,75,32,37],2:[54,99,36,46],3:[35,77,0,10],4:[62,25,0,25],
5:[0,66,0,89],6:[0,66,0,89],7:[0,0,0,0],8:[0,0,0,0]})
在[28]中:sums=values.copy()
在[29]中:sums.iloc[:,:]=''
在[31]中:对于“总计”列:
…:sums[列].apply(sum(values.loc[:,列:))
...:     
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
求和[列]。应用(求和(value.loc[:,列:))
文件“C:\WinPython64bit\python-3.5.2.amd64\lib\site packages\pandas\core\series.py”,第2220行,在apply中
mapped=lib.map\u推断(值,f,convert=convert\u数据类型)
pandas.lib.map\u expert(pandas\lib.c:63043)中的文件“pandas\src\expression.pyx”,第1088行
TypeError:“numpy.int64”对象不可调用
在[32]中:对于“总和”列:
…:sums[列]=sum(values.loc[:,列:)
在[33]中:总和
出[33]:
0   1   2   3   4   5   6   7  8
0  36  36  35  33  30  26  21  15  8
1  36  36  35  33  30  26  21  15  8
2  36  36  35  33  30  26  21  15  8
3  36  36  35  33  30  26  21  15  8

有没有一种方法可以做到这一点,而不必逐个循环每个点

在不循环的情况下,您可以反转数据帧,
cumsum
每行,然后重新反转:

>>> values.iloc[:,::-1].cumsum(axis=1).iloc[:,::-1]
     0    1    2    3    4    5   6  7  8
0  302  206  151   97   62    0   0  0  0
1  462  408  333  234  157  132  66  0  0
2   95   68   36    0    0    0   0  0  0
3  324  296  259  213  203  178  89  0  0

在不循环的情况下,您可以每行反转数据帧,
cumsum
,然后重新反转:

>>> values.iloc[:,::-1].cumsum(axis=1).iloc[:,::-1]
     0    1    2    3    4    5   6  7  8
0  302  206  151   97   62    0   0  0  0
1  462  408  333  234  157  132  66  0  0
2   95   68   36    0    0    0   0  0  0
3  324  296  259  213  203  178  89  0  0

您可以使用
.cumsum()
方法来获取累积和。问题是is是从左到右运行的,从右到左需要它

因此,我们将反转数据帧,使用
cumsum()
,然后将轴设置回正确的顺序

import pandas as pd

values = pd.DataFrame({0:[96,54,27,28],
          1:[55,75,32,37],2:[54,99,36,46],3:[35,77,0,10],4:[62,25,0,25],
          5:[0,66,0,89],6:[0,66,0,89],7:[0,0,0,0],8:[0,0,0,0]})

values[values.columns[::-1]].cumsum(axis=1).reindex_axis(values.columns, axis=1)

# returns:
     0    1    2    3    4    5   6  7  8
0  302  206  151   97   62    0   0  0  0
1  462  408  333  234  157  132  66  0  0
2   95   68   36    0    0    0   0  0  0
3  324  296  259  213  203  178  89  0  0

您可以使用
.cumsum()
方法来获取累积和。问题是is是从左到右运行的,从右到左需要它

因此,我们将反转数据帧,使用
cumsum()
,然后将轴设置回正确的顺序

import pandas as pd

values = pd.DataFrame({0:[96,54,27,28],
          1:[55,75,32,37],2:[54,99,36,46],3:[35,77,0,10],4:[62,25,0,25],
          5:[0,66,0,89],6:[0,66,0,89],7:[0,0,0,0],8:[0,0,0,0]})

values[values.columns[::-1]].cumsum(axis=1).reindex_axis(values.columns, axis=1)

# returns:
     0    1    2    3    4    5   6  7  8
0  302  206  151   97   62    0   0  0  0
1  462  408  333  234  157  132  66  0  0
2   95   68   36    0    0    0   0  0  0
3  324  296  259  213  203  178  89  0  0

在你的图片的第四行有一个5,但不是在你的代码和最小的例子中,我认为这是一个小的打字错误?谢谢你指出这一点。小字体。我很快就会更正。在你的图片的第四行有一个5,但在你的代码和最小的例子中没有,我想这是一个小的打字错误?谢谢你指出这一点。小字体。我很快就会更正。我认为
values.iloc[:,:-1].cumsum(axis=1)。iloc[:,:-1]
就足够了。另外请注意,我使用了
iloc
,因为它的更显式和
ix
将被弃用。旁白:尽管
iloc
长两个字符,但当前的样式是避免使用
ix
,除非您确实需要它的复杂语义。感谢您在
ix
中指出,我把它们包括在良好实践的答案中。我认为
values.iloc[:,::-1].cumsum(axis=1)。iloc[:,:-1]
就足够了。另外请注意,我使用了
iloc
,因为它的更显式和
ix
将被弃用。旁白:尽管
iloc
长两个字符,但当前的样式是避免使用
ix
,除非您确实需要它的复杂语义。感谢您在
ix
中指出,我把它们包括在良好实践的答案中。