JD *_*ong 17 python group-by pandas
我正试着用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
Run Code Online (Sandbox Code Playgroud)
我没想到会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
Run Code Online (Sandbox Code Playgroud)
在上图中,该apply()功能的结果是Pandas系列.它缺少来自的groupby列df.groupby.我正在努力的本质是如何创建一个我应用于groupby的函数,该函数返回函数的结果和它被分组的列?
-----又一次更新------
看来,如果我这样做:
pd.DataFrame(t).reset_index()
Run Code Online (Sandbox Code Playgroud)
我找回了一个非常接近我所追求的数据帧.
您看到列为0的原因是因为输出.unique()是一个数组.
理解您的申请将如何运作的最佳方式是分组检查每个行动:
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
Run Code Online (Sandbox Code Playgroud)
大多数情况下,您希望这是一个聚合值.
输出grouped.apply将始终将组标签作为索引('col1'的唯一值),因此您的示例构造col1对我来说似乎有点迟钝.
注意:要弹出'col1'(索引)回到可以调用的列reset_index,所以在这种情况下.
In [15]: g.sum().reset_index()
Out[15]:
col1 col2
0 A 3
1 B 7
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34121 次 |
| 最近记录: |