Python 在pandas中,如何在对数据帧求和时获得数据帧作为输出

Python 在pandas中,如何在对数据帧求和时获得数据帧作为输出,python,dataframe,pandas,Python,Dataframe,Pandas,当我对一个数据帧求和时,它返回一个序列: 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.

当我对一个数据帧求和时,它返回一个序列:

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

我知道我可以通过这个
系列
构建一个新的
数据帧
。但是,还有其他的“泛基”方法吗?

我要继续说。。。“不”,我不认为有直接的方法可以做到这一点,泛神论的方法(也是pythonic的)是明确的:

pd.DataFrame(df.sum(), columns=['sum'])
或者更优雅地使用字典(请注意,这会复制求和数组):

正如@root所指出的,它使用起来更快:

(正如python的禅宗所说:“实用性胜过纯洁性”,因此,如果您关心这一次,请使用这一次)

然而,也许最泛泛的方法就是使用这个系列:)

一些
%timeit
s用于您的小示例:

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

我不确定早期的版本,但从pandas 0.18.1开始,可以使用该方法

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

df.sum()。to_frame()
应该执行您想要的操作


请参阅。

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

df.sum().to_frame().transpose()
通过
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)

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

df.agg(['sum'])

我认为
pd.DataFrame({'my_sum':df.sum()})
已经足够了。这让你有可能“命名”你的总和。虽然不干净,
pd.DataFrame(np.sum(df.values,axis=1),columns=['my_sum'])
应该要快得多…+1对于pandartic,但我认为答案是否定的:(啊,所以我们决定使用“pandartic”?对我来说很有用(“pandartic”,我也喜欢它,但没有“s”。@DSM“pandartic”看起来有点太像“恐怖”(而不是恐怖)…在《潘多斯特》中没有歧义,我想我被说服了!:)安迪,谢谢你的回复。我暂时将问题留待其他可能的答案。如果没有其他答案,您将在几天内接受。或者您可以只写
.T
而不是
.transpose()
为了简洁:
df.sum().to_frame('sum')。T
df.sum().to_frame().transpose()
a = DF.sum()
sum = list(a)
values = list(a.index)

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

Agg_DF = pd.DataFrame(Series_Dict)
df.agg(['sum'])