在pandas中,当我对DataFrame求和时,如何将DataFrame作为输出

wai*_*kuo 6 python dataframe pandas

我总结一下DataFrame,它返回一个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
Run Code Online (Sandbox Code Playgroud)

我知道我可以DataFrame通过这种方式构建一个新的Series.但是,还有更"丑陋"的方式吗?

Plo*_*oon 7

通常不仅需要将列的总和转换为数据帧,而且还需要转置结果数据帧。还有一种方法可以做到这一点:

df.sum().to_frame().transpose()
Run Code Online (Sandbox Code Playgroud)


And*_*den 6

我要继续说......"不",我不认为有直接的方法去做,pandastic方式(和pythonic一样)是明确的:

pd.DataFrame(df.sum(), columns=['sum'])
Run Code Online (Sandbox Code Playgroud)

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

pd.DataFrame({'sum': df.sum()})
Run Code Online (Sandbox Code Playgroud)

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

pd.DataFrame(np.sum(df.values, axis=0), columns=['sum'])
Run Code Online (Sandbox Code Playgroud)

(正如蟒蛇国家的禅宗:"实用性胜过纯洁",所以如果你关心这个时候,请使用这个).

然而,也许常见的方式就是使用该系列!:)

.

一些%timeits代表你的小例子:

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
Run Code Online (Sandbox Code Playgroud)

并稍微大一点:

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
Run Code Online (Sandbox Code Playgroud)


Art*_*zbs 6

您可以使用agg诸如 之类的简单操作sum,看看它有多紧凑:

df.agg(['sum'])
Run Code Online (Sandbox Code Playgroud)

然而,这可能会带来显着的性能成本。当较短的执行时间比较短的代码行更重要时,请考虑其他解决方案。


小智 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
Run Code Online (Sandbox Code Playgroud)

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