【问题标题】:python-Pandas df.sum() across multiple columns unexpected arg 'axis' errorpython-Pandas df.sum() 跨多个列意外 arg 'axis' 错误
【发布时间】:2017-04-01 18:42:06
【问题描述】:

这里我有一个 pandas Dataframe df,例如:

     A    B    C
 0   1    2    3
 1   1    2    3
 3   1    2    3

然后我有一个清单

x=['B','C']

我想得到 B & C 列下每一行的每个数字的总和。所以我这样写:

df[x].sum(axis=1).values

但是,我得到一个错误

TypeError: f() got an unexpected keyword argument 'axis'

我不明白为什么这会出错。我的代码在 ipython notebook 中运行。你能给点建议吗?谢谢。

更新:真正的 df 是这样的:

                  Date      Ayotte  Hassan
Date                                 
2016-06-29     2016-06-29    46.8    45.3
2016-06-30     2016-06-30    46.8    45.3
2016-07-01     2016-07-01    46.8    45.3
2016-07-02     2016-07-02    46.8    45.3
2016-07-03     2016-07-03    46.8    45.3
2016-07-04     2016-07-04    46.8    45.3
2016-07-20     2016-07-20    45.8    45.2
2016-07-21     2016-07-21    45.8    45.2
2016-07-22     2016-07-22    45.8    45.2
   ...            ...         ...     ...
2016-10-09     2016-10-09    48.0    44.5
2016-10-10     2016-10-10    48.0    44.5
2016-10-11     2016-10-11    46.7    44.7
2016-10-16     2016-10-16    46.3    44.0
2016-10-17     2016-10-17    46.3    44.0
2016-10-18     2016-10-18    46.0    44.3
2016-10-19     2016-10-19    45.7    45.3
2016-10-20     2016-10-20    44.0    46.0
2016-10-21     2016-10-21    44.0    46.0
2016-10-22     2016-10-22    44.0    46.0
2016-10-23     2016-10-23    44.0    46.0

df的dtypes是

Date      datetime64[ns]
Ayotte           float64
Hassan           float64
dtype: object

然后,我做到了

df = df.resample('D')

上面显示的df是重采样前的数据。列表 x 是

x=['Ayotte','Hassan']

然后我运行这段代码就报错了

print df[x].sum(axis=1).values

【问题讨论】:

  • 您的意思是让您的索引在 DataFrame 中变为 0、1、3 吗?因为我做了完全相同的事情(使用适当的指标)并且它有效。
  • @pshep123 没关系
  • .values 是问题 编辑,我收回了....它对我有用
  • @pshep123 我的 df 的索引是像 2016-11-18 这样的日期。
  • @anshanno 我尝试不使用.values,但仍然出现同样的错误。

标签: python pandas dataframe typeerror


【解决方案1】:

如果没有证明错误的连续示例,很难诊断。

如果我开始:

import numpy
import pandas
df = pandas.DataFrame(
    numpy.arange(9).reshape(3, 3),
    index=['a', 'b', 'c'],
    columns=['X', 'Y', 'Z']
)
print(df)

这给出了:

   X  Y  Z
a  0  1  2
b  3  4  5
c  6  7  8

我可以这样做:

df[['X', 'Y']].sum(axis=1)

获得:

a     1
b     7
c    13
dtype: int64

【讨论】:

  • 感谢您的回复。我自己也尝试了一些东西,没有错误。我的实际数据框 df 有三列:日期、人员 1、人员 2。 df 的索引也是日期。日期就像 2016-11-18。在 person1/2 下,有 float64 数字。当我尝试按上述方式计算总和时,我会得到错误。
【解决方案2】:

在:

,Date,Ayotte,Hassan
2016-06-29,2016-06-29,46.8,45.3
2016-06-30,2016-06-30,46.8,45.3
2016-07-01,2016-07-01,46.8,45.3
2016-07-02,2016-07-02,46.8,45.3
2016-07-03,2016-07-03,46.8,45.3
2016-07-04,2016-07-04,46.8,45.3
2016-07-20,2016-07-20,45.8,45.2

代码:

import pandas as pd

df = pd.read_csv('file.txt', index_col=0)
df['Total'] = df[['Ayotte', 'Hassan']].sum(axis=1)

print df

输出:

                  Date  Ayotte  Hassan  Total
2016-06-29  2016-06-29    46.8    45.3   92.1
2016-06-30  2016-06-30    46.8    45.3   92.1
2016-07-01  2016-07-01    46.8    45.3   92.1
2016-07-02  2016-07-02    46.8    45.3   92.1
2016-07-03  2016-07-03    46.8    45.3   92.1
2016-07-04  2016-07-04    46.8    45.3   92.1
2016-07-20  2016-07-20    45.8    45.2   91.0

【讨论】:

  • 谢谢。我试过这个但仍然得到同样的错误。但是,我发现如果我删除df = df.resample('D') 行,它就会起作用。你对此有什么想法吗?
  • @Mr_Pi 不确定,我从未使用过重采样。您是否使用该重新采样只是为了将日期转换为年月日?从文档看来,您应该按系列调用它series.resample()。但如果你想要的只是 Y-m-d 中的日期,你应该使用类似 df['in_day'] = df.my_datetime.dt.strftime('%Y-%m-%d')
  • resample 不返回数据帧。它返回一个分组对象,您需要先聚合 resample 对象,然后再将其视为普通数据框。
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多