假设我创建了一个DataFrame:
import pandas as pd
df = pd.DataFrame({"a": [1,2,3,13,15], "b": [4,5,6,6,6], "c": ["wish", "you","were", "here", "here"]})
Run Code Online (Sandbox Code Playgroud)
像这样:
a b c
0 1 4 wish
1 2 5 you
2 3 6 were
3 13 6 here
4 15 6 here
Run Code Online (Sandbox Code Playgroud)
...然后按几列分组和汇总......
gb = df.groupby(['b','c']).agg({"a": lambda x: x.nunique()})
Run Code Online (Sandbox Code Playgroud)
产生以下结果:
a
b c
4 wish 1
5 you 1
6 here 2
were 1
Run Code Online (Sandbox Code Playgroud)
是否可以df与新聚合的表合并,以便gb在df中创建一个新列,其中包含相应的值gb?像这样:
a b c nc
0 1 4 wish 1
1 2 5 you 1
2 3 6 were 1
3 13 6 here 2
4 15 6 here 2
Run Code Online (Sandbox Code Playgroud)
我尝试做最简单的事情:
df.merge(gb, on=['b','c'])
Run Code Online (Sandbox Code Playgroud)
但是这给出了错误:
KeyError: 'b'
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为分组表具有多索引而b不是列.所以我的问题是双重的:
gbDataFrame 的多索引转换回列(以便它具有b和c列)吗?df使用gb的列名?每当你想将groupby操作中的一些聚合列添加回你应该使用的df时transform,这会产生一个其索引与你的orig df对齐的系列:
In [4]:
df['nc'] = df.groupby(['b','c'])['a'].transform(pd.Series.nunique)
df
Out[4]:
a b c nc
0 1 4 wish 1
1 2 5 you 1
2 3 6 were 1
3 13 6 here 2
4 15 6 here 2
Run Code Online (Sandbox Code Playgroud)
无需重置索引或执行其他合并.
| 归档时间: |
|
| 查看次数: |
837 次 |
| 最近记录: |