16

当我对 a 求和DataFrame时,它返回 a Series

In [1]: import pandas as pd
In [2]: df = pd.DataFrame([[1, 2, 3], [2, 3, 3]], columns=['a', 'b', 'c'])

In [3]: df
Out[3]: 
      a  b  c
   0  1  2  3
   1  2  3  3

   In [4]: s = df.sum()

   In [5]: type(s)
   Out[5]: pandas.core.series.Series

我知道我可以DataFrame通过 this构建一个新的Series。但是,还有更多“熊猫”的方式吗?

4

6 回答 6

10

我要继续说......“不”,我认为没有直接的方法可以做到这一点,pandastic 方式(和 pythonic 也是)是明确的:

pd.DataFrame(df.sum(), columns=['sum'])

或者,更优雅地,使用字典(请注意,这会复制求和数组):

pd.DataFrame({'sum': df.sum()})

正如@root 所说,它使用起来更快:

pd.DataFrame(np.sum(df.values, axis=0), columns=['sum'])

(正如python的禅宗所说:“实用胜过纯洁”,所以如果你在乎这个时间,就用这个)。

然而,也许流行的方式就是使用系列!:)

.

一些%timeit小例子:

In [11]: %timeit pd.DataFrame(df.sum(), columns=['sum'])
1000 loops, best of 3: 356 us per loop

In [12]: %timeit pd.DataFrame({'sum': df.sum()})
1000 loops, best of 3: 462 us per loop

In [13]: %timeit  pd.DataFrame(np.sum(df.values, axis=0), columns=['sum'])
1000 loops, best of 3: 205 us per loop

对于一个稍大的:

In [21]: df = pd.DataFrame(np.random.randn(100000, 3), columns=list('abc'))

In [22]: %timeit pd.DataFrame(df.sum(), columns=['sum'])
100 loops, best of 3: 7.99 ms per loop

In [23]: %timeit pd.DataFrame({'sum': df.sum()})
100 loops, best of 3: 8.3 ms per loop

In [24]: %timeit  pd.DataFrame(np.sum(df.values, axis=0), columns=['sum'])
100 loops, best of 3: 2.47 ms per loop
于 2013-05-10T23:38:30.783 回答
8

通常不仅需要将列的总和转换为数据帧,还需要转置结果数据帧。为此还有一种方法:

df.sum().to_frame().transpose()
于 2020-04-17T18:00:12.807 回答
5

我不确定早期版本,但从 pandas 0.18.1 开始,可以使用pandas.Series.to_frame方法。

import pandas as pd
df = pd.DataFrame([[1, 2, 3], [2, 3, 3]], columns=['a', 'b', 'c'])
s = df.sum().to_frame(name='sum')

type(s)

>>> pandas.core.frame.DataFrame

name参数是可选的,并定义列名。

于 2017-09-08T10:38:38.420 回答
2

df.sum().to_frame()应该做你想做的。

请参阅https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.to_frame.html

于 2018-02-13T02:27:35.607 回答
1

您可以agg用于简单的操作,例如sum,看看这是多么紧凑:

df.agg(['sum'])
于 2021-03-09T13:50:51.490 回答
0

通过DF.sum().to_frame()或将聚合结果直接存储到 Dataframe 不是一个健康的选择。更重要的是,当您想要单独存储聚合值和聚合总和时。使用 DF.sum().to_frame 将存储值并求和。

在下面尝试更清洁的版本。

a = DF.sum()
sum = list(a)
values = list(a.index)

Series_Dict = {"Agg_Value":values, "Agg_Sum":sum}

Agg_DF = pd.DataFrame(Series_Dict)
于 2020-09-10T14:41:19.250 回答