【发布时间】:2013-02-06 20:52:11
【问题描述】:
我正在尝试围绕 Pandas groupby 方法。我想编写一个函数来执行一些聚合函数,然后返回一个 Pandas DataFrame。这是一个使用 sum() 的非常简化的示例。我知道有更简单的方法来做简单的求和,在现实生活中我的函数更复杂:
import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2':[1.0, 2, 3, 4]})
In [3]: df
Out[3]:
col1 col2
0 A 1
1 A 2
2 B 3
3 B 4
def func2(df):
dfout = pd.DataFrame({ 'col1' : df['col1'].unique() ,
'someData': sum(df['col2']) })
return dfout
t = df.groupby('col1').apply(func2)
In [6]: t
Out[6]:
col1 someData
col1
A 0 A 3
B 0 B 7
我没想到那里有两次col1,我也没想到那个神秘索引的东西。我真的以为我会得到col1 和someData。
在我的实际应用程序中,我按不止一列进行分组,并且真的很想取回 DataFrame 而不是 Series 对象。
在上面的示例中,关于 Pandas 正在做什么的解决方案或解释有什么想法吗?
-- 添加信息 -----
我想我应该从这个例子开始:
In [13]: import pandas as pd
In [14]: df = pd.DataFrame({'col1':['A','A','A','B','B','B'], 'col2':['C','D','D','D','C','C'], 'col3':[.1,.2,.4,.6,.8,1]})
In [15]: df
Out[15]:
col1 col2 col3
0 A C 0.1
1 A D 0.2
2 A D 0.4
3 B D 0.6
4 B C 0.8
5 B C 1.0
In [16]: def func3(df):
....: dfout = sum(df['col3']**2)
....: return dfout
....:
In [17]: t = df.groupby(['col1', 'col2']).apply(func3)
In [18]: t
Out[18]:
col1 col2
A C 0.01
D 0.20
B C 1.64
D 0.36
在上图中,apply() 函数的结果是 Pandas 系列。它缺少来自df.groupby 的groupby 列。我苦苦挣扎的本质是如何创建一个应用于 groupby 的函数,该函数返回函数的结果和分组的列?
--又一次更新------
看来,如果我这样做:
pd.DataFrame(t).reset_index()
我得到了一个非常接近我所追求的数据框。
【问题讨论】:
-
顺便说一句,本教程由一位 pandas 程序员帮助我了解了 pandas 的 groupby 和聚合机制:youtube.com/watch?v=MxRMXhjXZos
-
在您附加的示例中,groupby 的目的是什么(它只会找到骗子),您可以对 df 本身进行应用并将其添加为列:
df['func3'] = df.apply(lambda row: row['col2'] ** 2, axis=1). ? -
这个例子的数据有点太简单了,恐怕。我将更新示例。
-
我看不到一个示例,其中对所有列进行分组并应用而不是仅仅应用(DataFrames 应用可能非常重要并保存到多个列)是有意义的。 (另外你不需要创建一个 dfout 返回变量,你可以只返回计算,例如
return df['col3']**2:)) -
示例已更新...现在可以使用了!天哪。似乎当应用在每一行上时它不会返回键,但如果应用导致聚合它确实返回键