首页 > 解决方案 > 缺少值时如何旋转和重命名连接的级别列?

问题描述

我有一个数据框。每个 id 有几个代码,每个代码都有统计信息。并非所有 id 都拥有其他人拥有的所有代码。我需要旋转数据框,以便每个 id 都有一行,每个代码-统计对都有一列。

我应该如何使用 pandas 0.24.2 和 python 3.6 最有效地做到这一点?

谢谢

import pandas as pd

df = pd.DataFrame({'id':[11, 11, 11, 12, 12, 13], 'code':['a', 'b', 'c', 'a', 'b', 'a'], 'max':[111, 112, 113, 221, 222, 333], 'min':[10, 11, 12, 21, 22, 33]})

df
Results in
    id code  max  min
0   11    a  111   11
1   11    b  112   12
2   11    c  113   13
3   12    a  221   21
4   12    b  222   22
5   13    c  333   33

我需要将其转换为

id a_max a_min b_max b_min c_max c_min
11   111    11   112    12   113    13     
12   221    21   222    22  None  None
13  None  None  None  None   333    33

更新 我发布的代码有错误。对于代码“a”,代码应为 11、12、13 而不是 10、11、12。

import pandas as pd
df = pd.DataFrame({'id':[11, 11, 11, 12, 12, 13], 'code':['a', 'b', 'c', 'a', 'b', 'a'], 'max':[111, 112, 113, 221, 222, 333], 'min':[11, 12, 13, 21, 22, 33]})
df

标签: pythonpandaspivot

解决方案


DataFrame.set_indexDataFrame.unstackand一起使用,然后将索引DataFrame.sort_index展平并转换为按列:MultiIndexreset_index

df1 = df.set_index(['id','code']).unstack().sort_index(axis=1, level=1)
df1.columns = df1.columns.map('_'.join)
df1 = df1.reset_index()
print (df1)
   id  max_a  min_a  max_b  min_b  max_c  min_c
0  11  111.0   10.0  112.0   11.0  113.0   12.0
1  12  221.0   21.0  222.0   22.0    NaN    NaN
2  13  333.0   33.0    NaN    NaN    NaN    NaN

如果可能成对重复是必要的聚合DataFrame.pivot_table

df = pd.DataFrame({'id':[11, 11, 11, 12, 12, 13], 
                   'code':['a', 'a', 'c', 'a', 'b', 'a'], 
                   'max':[111, 112, 113, 221, 222, 333], 
                   'min':[10, 11, 12, 21, 22, 33]})
print (df)
   id code  max  min
0  11    a  111   10 <--- 11, a
1  11    a  112   11 <--- 11, a
2  11    c  113   12
3  12    a  221   21
4  12    b  222   22
5  13    a  333   33

df1 = df.pivot_table(index='id',columns='code', aggfunc='mean').sort_index(axis=1, level=1)
#alternative
#df1 = df.groupby(['id','code']).mean().unstack().sort_index(axis=1, level=1)
df1.columns = df1.columns.map('_'.join)
df1 = df1.reset_index()
print (df1)
   id  max_a  min_a  max_b  min_b  max_c  min_c
0  11  111.5   10.5    NaN    NaN  113.0   12.0
1  12  221.0   21.0  222.0   22.0    NaN    NaN
2  13  333.0   33.0    NaN    NaN    NaN    NaN

推荐阅读