去除熊猫数据帧上多余的标签



所以我通过执行以下操作获得了一个数据帧:

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

最新更新