如何在numpy中对一列进行求和

3

我有一个数据框,我将其转换为数组(这是一个测试场景,因为我在pandas的结果方面存在问题)。现在我想要对其中一列进行求和。

我有以下代码:

import sys
import pandas as pd
import numpy as np
import os
from tkinter import *


#data_rbu = np.genfromtxt('tmp_fakt_daten.csv', delimiter=',', dtype=None)
data_rbu = pd.read_excel('tmp_fakt_daten.xlsx')
array_rbu = data_rbu.as_matrix()
print(array_rbu)
summe1 = np.sum(array_rbu, axis=9, dtype=float)
print(summe1)

这是数组!我想要将KW_WERT和NETTO_EURO相加。
执行代码后,我得到了以下错误:
Traceback (most recent call last):
  File "C:\Users\----------\[INPROGRESS] Faktura_sylvia\csv_einlesen bzgl. float\test2.py", line 12, in <module>
    summe1 = np.sum(array_rbu, axis=9, dtype=float)
  File "C:\Users\---------\Winpython\python-3.4.3\lib\site-packages\numpy\core\fromnumeric.py", line 1724, in sum
    out=out, keepdims=keepdims)
  File "C:\Users\----------\Winpython\python-3.4.3\lib\site-packages\numpy\core\_methods.py", line 32, in _sum
    return umr_sum(a, axis, dtype, out, keepdims)
ValueError: 'axis' entry is out of bounds

我知道问题出在轴编号上,但我不确定具体哪里出错了。我查看了numpy.sum的文档... 希望你能帮助我! Damian

虽然我在@JulienBernu的回答下评论了我的想法,但我建议您简单地这样做:np_arr = data_rbu[['KW_WERT', 'NETTO_EURO']].values # gives you numpy array with just the columns you want,然后 numpy.sum(np_arr, axis=0),你会得到相同的答案。这是关于numpy.sum的numpy文档:http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html,请查看示例;特别是第4和第5个示例。 - Kartik
您收到ValueError的原因是您没有第9个轴。您的矩阵是二维的,只有行和列。因此,它只有两个轴:0和1。如果它是一个三维矩阵(行、列和深度),则会有3个轴:0、1、2等等。你明白了。您正在尝试对第9列求和,这与第9个轴不同。您需要的是numpy.sum(array_rbu[:,7])用于“KW_WERT”,以及numpy.sum(array_rbu[:,8])用于“NETTO_EURO”...明白了吗?另外,numpy是从0开始索引的,所以第9列是最后一列(TA),它是一个字符串,无法求和...很高兴帮助! - Kartik
2个回答

3

正如您所说,这些值是存储在数组中的:

In[10]:arr
Out[10]: 
array([['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'B',
        1001380363.0, 'B60ETS', 0.15, 18.9, 'SDH'],
       ['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'B',
        1001380363.0, 'B60ETS', 0.145, 18.27, 'SDH'],
       ['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'B',
        1001380363.0, 'B60ETS', 0.145, 18.27, 'SDH'],
       ['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'B',
        1001380363.0, 'B60ETS', 0.15, 18.9, 'SDH'],
       ['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'B',
        1001380363.0, 'B60ETS', 0.15, 18.9, 'SDH'],
       ['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'B',
        1001380363.0, 'B60ETS', 0.145, 18.27, 'SDH'],
       ['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'B',
        1001380363.0, 'B60ETS', 0.15, 18.9, 'SDH'],
       ['ZPAF', '2015-12-10', '2015-12-31', 'T-HOME ICP', 'E',
        1001380594.0, 'B60ETS', 3.011, 252.92, 'DSLAM/MSAN']], dtype=object)

你可以使用 arr.sum 进行操作:
sum_arr=arr.sum(axis=0)

axis=0表示按列求和,然后您可以根据其索引访问该列。对于您的情况,对于列KW_WERTNETTO_EURO,您可以得到如下总和:

In[25]:sum_arr[7]
Out[25]: 4.046

In[26]:sum_rr[8]
In[23]: 383.33

1
直接在pandas中执行:
data_rbu = pd.read_excel('tmp_fakt_daten.xlsx')
summe1 = data_rbu['KW_WERT'] + data_rbu['NETTO_EURO'] # gets you a series
summe1.sum() # gets you the total sum (if that's what you are after)

那就是重点!我已经用Pandas完成了,但我也想在NumPy中检查结果。 - Damian
pandas和numpy在数值方面基本相同:summe1.values将为您提供底层的np.array。(只有NaN或None的处理方式可能不同,如果有的话...)您可以在任何地方使用.values执行所有相同的操作。这只是有点难看... - Julien
Pandas 使用 numpy 进行大多数甚至全部的数学计算。在内部(并且是一个简化的描述),数值型 Pandas 列是 numpy 数组,并对它们使用 numpy 方法。因此,将 pandas.DataFrame.sum 的输出与 numpy.sum 进行比较,就像将同样的苹果与自身进行比较,或者盯着两张相同的照片试图找出不同之处,或者看着镜子里的自己,检查所有的疣、痣、雀斑和酒窝是否在同一个位置... 如果你问我,这有点无意义。 - Kartik
@Kartik 不完全正确。正如我所提到的,它们处理 nan 的方式是不同的:尝试 pd.DataFrame([0, None]).sum()pd.DataFrame([0, None]).values.sum()。第一个忽略了 nan 并给出了 0,而第二个则给出了 nan - Julien
是的,这是真的。这是因为Pandas自动删除NaN值。这就是它被创建的方式。另一方面,Numpy希望用户明确地使用numpy.isfinitenumpy.isnan来过滤NaN。基本上,pd.DataFrame([0, None]).sum()np.sum(pd.DataFrame([0, None]).dropna(), axis=0)完全相等(因为在pd.DataFrame.sum中,0是默认轴)。除了删除NaN的差异(以及其他一些小问题),这两个软件包下的工作原理是相同的。 - Kartik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接