【问题标题】:Drop top level header on selected columns and turn selected column names into column values将顶级标题放在所选列上并将所选列名转换为列值
【发布时间】:2022-01-03 10:27:41
【问题描述】:

我有一个如下定义的数据框:

cols = pd.MultiIndex.from_tuples([("unnamed_0", "b"), ("unnamed_1", "c"),('total','A'),('total','B'),('total','C')])
df = pd.DataFrame([[1,2,3,4,5], [3,4,5,6,7],[5,6,8,9,10],[7,8,11,12,13],[9,19,13,24,25]], columns=cols)
df

这是:

  unnamed_0 unnamed_1 total        
          b         c     A   B   C
0         1         2     3   4   5
1         3         4     5   6   7
2         5         6     8   9  10
3         7         8    11  12  13
4         9        19    13  24  25

我想要的是将此数据框转换为:

d = {'b': [1, 1,1,3,3,3,5,5,5,7,7,7,9,9,9], 'c': [2,2,2,4,4,4,6,6,6,8,8,8,19,19,19],'total':[3,4,5,5,6,7,8,9,10,11,12,13,13,24,25],'type':['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C']}
df2 = pd.DataFrame(d)
print(df2)

即:

    b   c  total type
0   1   2      3    A
1   1   2      4    B
2   1   2      5    C
3   3   4      5    A
4   3   4      6    B
5   3   4      7    C
6   5   6      8    A
7   5   6      9    B
8   5   6     10    C
9   7   8     11    A
10  7   8     12    B
11  7   8     13    C
12  9  19     13    A
13  9  19     24    B
14  9  19     25    C

我最初尝试使用删除两个 unnamed_

df = df.xs(["unnamed_0","unnamed_1"], axis=1, drop_level=True)

但这并不顺利,因为除了我想要的之外,它丢弃了所有东西。至于将 2 级标题转换为列值,我想到了使用类似 df.T.unstack().reset_index(level=1, name='type').rename(columns={'level_1':'A'})[['type','A']] 的东西,如本例所示:

df=pd.DataFrame(index=['x','y'], data={'a':[1,2],'b':[3,4]})

   a  b
x  1  3
y  2  4

df.T.unstack().reset_index(level=1, name='c1').rename(columns={'level_1':'c2'})[['c1','c2']]
    
   c1 c2
x   1  a
x   3  b
y   2  a
y   4  b
​

但我没有设法将其应用于多级标题数据帧。

任何帮助将不胜感激。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    使用melt:

    >>> df.droplevel(0, axis=1).melt(['b', 'c'], var_name='type', value_name='total')
        b   c type  total
    0   1   2    A      3
    1   3   4    A      5
    2   5   6    A      8
    3   7   8    A     11
    4   9  19    A     13
    5   1   2    B      4
    6   3   4    B      6
    7   5   6    B      9
    8   7   8    B     12
    9   9  19    B     24
    10  1   2    C      5
    11  3   4    C      7
    12  5   6    C     10
    13  7   8    C     13
    14  9  19    C     45
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      相关资源
      最近更新 更多