gpt4 book ai didi

python - 从 pandas groupby 返回聚合数据框

转载 作者:IT老高 更新时间:2023-10-28 21:14:08 25 4
gpt4 key购买 nike

我正在尝试围绕 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 在那里,我也没想到那个神秘索引的东西。我真的以为我会得到 col1someData

在我的实际应用程序中,我按不止一列进行分组,并且真的希望返回一个 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()

我得到了一个非常接近我所追求的数据框。

最佳答案

您看到列为 0 的原因是因为 .unique() 的输出是一个 array

了解应用程序如何工作的最佳方法是逐组检查每个操作:

In [11] :g = df.groupby('col1')

In [12]: g.get_group('A')
Out[12]:
col1 col2
0 A 1
1 A 2

In [13]: g.get_group('A')['col1'].unique()
Out[13]: array([A], dtype=object)

In [14]: sum(g.get_group('A')['col2'])
Out[14]: 3.0

大多数情况下,您希望这是一个聚合的

grouped.apply 的输出将始终将组标签作为索引('col1' 的唯一值),因此您的 col1 示例构造似乎对我来说有点迟钝。

注意:要将 'col1'(索引)弹出回一列,您可以调用 reset_index ,所以在这种情况下。

In [15]: g.sum().reset_index()
Out[15]:
col1 col2
0 A 3
1 B 7

关于python - 从 pandas groupby 返回聚合数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com