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

rhfm7lfc  于 2023-03-21  发布在  其他
关注(0)|答案(6)|浏览(135)

当我对一个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

我知道我可以用这个Series构造一个新的DataFrame。但是,还有什么更“pandasic”的方法吗?

bgtovc5b

bgtovc5b1#

我会继续说......“不”,我不认为有一个直接的方法来做到这一点,pandastic的方法(也是pythonic的)是明确的:

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

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

pd.DataFrame({'sum': df.sum()})
  • 正如@root所指出的,它的使用速度更快:*
pd.DataFrame(np.sum(df.values, axis=0), columns=['sum'])

(As Python中的Zen说:“实用胜过纯洁”,所以如果你关心这个时间,就用这个)。

  • 然而,也许讽刺的方式是只使用该系列!*:)


一些%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
vawmfj5a

vawmfj5a2#

通常,不仅需要将列的总和转换为 Dataframe ,而且还需要将结果 Dataframe 转置。还有一种方法:

df.sum().to_frame().transpose()
wvmv3b1j

wvmv3b1j3#

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

df.agg(['sum'])

但是,这可能会带来很大的性能损失。当更短的执行时间比更短的代码行更重要时,请考虑其他解决方案。

ih99xse1

ih99xse14#

我不确定早期版本,但从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参数是可选的,用于定义列名。

ktecyv1j

ktecyv1j6#

通过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)

相关问题