所以我通过执行以下操作获得了一个数据帧:
dfgrp=df.groupby(['CCS_Category_ICD9','Gender'])['f0_'].sum()
ndf=pd.DataFrame(dfgrp)
ndf
f0_
CCS_Category_ICD9 Gender
1 F 889
M 796
U 2
2 F 32637
M 33345
U 34
其中f0_是按性别分列的计数总和我真正想要的只是一个简单的一级数据帧,类似于我通过它获得的
ndf=ndf.unstack(level=1)
ndf
f0_
Gender F M U
CCS_Category_ICD9
1 889.0 796.0 2.0
2 32637.0 33345.0 34.0
3 2546.0 1812.0 NaN
4 347284.0 213782.0 34.0
但我想要的是:
CCS_Category_ICD9 F M U
1 889.0 796.0 2.0
2 32637.0 33345.0 34.0
3 2546.0 1812.0 NaN
4 347284.0 213782.0 34.0
我不知道如何扁平化或摆脱与f0_和性别相关的级别,我只需要"M","F","U"列标题,所以我有一个简单的一级数据帧。我已经尝试了reset_index和set_index以及其他几种变体,但没有运气......
最后,我想有一个带有行和列总计的简单交叉表(我的示例没有显示。.
好吧,我做到了(正如一个答案中所建议的那样):
ndf = ndf.f0_.unstack()
ndf
这给了我:
Gender F M U
CCS_Category_ICD9
1 889.0 796.0 2.0
2 32637.0 33345.0 34.0
3 2546.0 1812.0 NaN
4 347284.0 213782.0 34.0
其次:
nndf=ndf.reset_index(['CCS_Category_ICD9','F','M','U'])
nndf
Gender CCS_Category_ICD9 F M U
0 1 889.0 796.0 2.0
1 2 32637.0 33345.0 34.0
2 3 2546.0 1812.0 NaN
3 4 347284.0 213782.0 34.0
4 5 3493.0 7964.0 1.0
5 6 12295.0 9998.0 4.0
这差不多可以做到但是无论我做什么,我都无法将索引名称从性别更改为类似 Idx 的东西,我都会添加一行额外的行,其中包含新名称,即在性别下标题为 Idx 的行。还有更直接的解决方案吗?
你可以
df.loc[:, 'f0_']
对于由 .unstack()
产生的DataFrame
,即,选择仅保留gender
级别的MultiIndex
列的第一级,或者
df.columns = df.columns.droplevel()
查看MultiIndex.droplevel
文档
因为ndf
是一个pd.DataFrame
所以它有一个列索引。 执行unstack()
时,它会将行索引中的最后一个级别追加到列索引。 由于列已经有f0_
,因此您获得了第二个级别。 要按您想要的方式展平,请改为在列上调用 unstack()
。
ndf = ndf.f0_.unstack()
文本Gender
是列索引的名称。 如果要删除它,则必须覆盖该对象的 name 属性。
ndf.columns.name = None
在ndf.f0_.unstack()
后立即使用它
通常,如果要使用一列作为行索引,将另一列用作列索引,请使用df.pivot
。当您需要聚合由于具有重复(行,列)对的行而聚合值时,请使用df.pivot_table
。
在这种情况下,您可以使用df.groupby(...)[...].sum().unstack()
而不是 df.pivot_table
:
import numpy as np
import pandas as pd
N = 100
df = pd.DataFrame({'CCS': np.random.choice([1,2], size=N),
'Gender':np.random.choice(['F','M','U'], size=N),
'f0':np.random.randint(10, size=N)})
result = df.pivot_table(index='CCS', columns='Gender', values='f0', aggfunc='sum')
result.columns.name = None
result = result.reset_index()
收益 率
CCS F M U
0 1 89 104 90
1 2 66 65 65
请注意,在调用pivot_table()
后,数据帧result
已命名索引和列Indexes
:
In [176]: result = df.pivot_table(index='CCS', columns='Gender', values='f0', aggfunc='sum'); result
Out[176]:
Gender F M U
CCS
1 89 104 90
2 66 65 65
该索引名为 CSS
:
In [177]: result.index
Out[177]: Int64Index([1, 2], dtype='int64', name='CCS')
列索引名为 Gender
:
In [178]: result.columns
Out[178]: Index(['F', 'M', 'U'], dtype='object', name='Gender') # <-- notice the name='Gender'
要从Index
中删除名称,请将None
分配给 name
属性:
In [179]: result.columns.name = None
In [180]: result
Out[180]:
F M U
CCS
1 95 68 67
2 82 63 68
尽管此处不需要从多索引级别中删除名称,将 None
s 的列表分配给 names
(复数)属性:
result.columns.names = [None]*numlevels