Python 将DataFrame的列设置为数据框中其他列的总和
我有一个如下所示的数据框,称之为“值”: 我想创建另一个,称之为“sums”,它包含从“sums”列到末尾的数据帧“值”的总和。如下所示: 我想创建这个,而不必查看整个数据帧,逐个数据点。我一直在尝试使用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,
.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
中指出,我把它们包括在良好实践的答案中。