我有一个数据框,我在其中对 3 列进行 groupby 并汇总数字列的总和和大小。运行代码后
df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum'])
Run Code Online (Sandbox Code Playgroud)
我得到如下内容:
现在我想从主列中拆分我的大小子列并仅创建单个大小的列,但希望将总和列保留在主列标题下。我尝试了不同的方法但没有成功。这些是我尝试过但无法让事情为我工作的方法:
将 Pandas GroupBy 对象转换为 DataFrame
如果有人可以帮助我解决这个问题,将不胜感激。
问候,
设置
d1 = pd.DataFrame(dict(
year=np.random.choice((2014, 2015, 2016), 100),
cntry=['United States' for _ in range(100)],
State=np.random.choice(states, 100),
Col1=np.random.randint(0, 20, 100),
Col2=np.random.randint(0, 20, 100),
Col3=np.random.randint(0, 20, 100),
))
df = d1.groupby(['year', 'cntry', 'State']).agg(['size', 'sum'])
df
Run Code Online (Sandbox Code Playgroud)
答案
最简单的方法本来只运行size后groupby
d1.groupby(['year', 'cntry', 'State']).size()
year cntry State
2014 United States California 10
Florida 9
Massachusetts 8
Minnesota 5
2015 United States California 9
Florida 7
Massachusetts 4
Minnesota 11
2016 United States California 8
Florida 8
Massachusetts 11
Minnesota 10
dtype: int64
Run Code Online (Sandbox Code Playgroud)
使用计算的 df
df.xs('size', axis=1, level=1)
Run Code Online (Sandbox Code Playgroud)
如果size每列不同,这将很有用。但是因为size列是相同的['Col1', 'Col2', 'Col3'],所以我们可以做
df[('Col1', 'size')]
year cntry State
2014 United States California 10
Florida 9
Massachusetts 8
Minnesota 5
2015 United States California 9
Florida 7
Massachusetts 4
Minnesota 11
2016 United States California 8
Florida 8
Massachusetts 11
Minnesota 10
Name: (Col1, size), dtype: int64
Run Code Online (Sandbox Code Playgroud)
组合视图 1
pd.concat([df[('Col1', 'size')].rename('size'),
df.xs('sum', axis=1, level=1)], axis=1)
Run Code Online (Sandbox Code Playgroud)
组合视图 2
pd.concat([df[('Col1', 'size')].rename(('', 'size')),
df.xs('sum', axis=1, level=1, drop_level=False)], axis=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5808 次 |
| 最近记录: |