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'])