首页 > 解决方案 > Python中的从宽到长

问题描述

我有以下格式的数据,


nan = np.nan
df = pd.DataFrame(d)

d在哪里

d = {'ID': {0: 1789, 1: 1872},
 'Name': {0: 'A', 1: 'B'},
 'June_2018_entity1_flag': {0: 1, 1: 1},
 'July_2018_entity1_flag': {0: 1, 1: 1},
 'August_2018_entity1_flag': {0: 0, 1: 1},
 'September_2018_entity1_flag': {0: 0, 1: 1},
 'October_2018_entity1_flag': {0: 0, 1: 1},
 'November_2018_entity1_flag': {0: 0, 1: 1},
 'December_2018_entity1_flag': {0: 0, 1: 1},
 'January_2019_entity1_flag': {0: 0, 1: 1},
 'February_2019_entity1_flag': {0: 0, 1: 1},
 'March_2019_entity1_flag': {0: 0, 1: 1},
 'April_2019_entity1_flag': {0: 0, 1: 1},
 'May_2019_entity1_flag': {0: 0, 1: 1},
 'June_2019_entity1_flag': {0: 0, 1: 1},
 'June_2018_entity1_value': {0: 100.0, 1: 8000.0},
 'July_2018_entity1_value': {0: 100.0, 1: 8000.0},
 'August_2018_entity1_value': {0: 0.0, 1: 8000.0},
 'September_entity1_2018_value': {0: nan, 1: 8000.0},
 'October_2018_entity1_value': {0: nan, 1: 8000.0},
 'November_2018_entity1_value': {0: nan, 1: 8000.0},
 'December_2018_entity1_value': {0: nan, 1: 8000.0},
 'January_2019_entity1_value': {0: nan, 1: 8000.0},
 'February_2019_entity1_value': {0: nan, 1: 8000.0},
 'March_2019_entity1_value': {0: nan, 1: 8000.0},
 'April_2019_entity1_value': {0: nan, 1: 8000.0},
 'May_2019_entity1_value': {0: nan, 1: 8000.0},
 'June_2019_entity1_value': {0: nan, 1: 8000.0},
 'July_2018_entity2_flag': {0: 0, 1: 0},
 'August_2018_entity2_flag': {0: 0, 1: 0},
 'September_2018_entity2_flag': {0: 0, 1: 0},
 'October_2018_entity2_flag': {0: 0, 1: 0},
 'November_2018_entity2_flag': {0: 0, 1: 0},
 'December_2018_entity2_flag': {0: 0, 1: 0},
 'January_2019_entity2_flag': {0: 0, 1: 0},
 'February_2019_entity2_flag': {0: 0, 1: 0},
 'March_2019_entity2_flag': {0: 0, 1: 0},
 'April_2019_entity2_flag': {0: 0, 1: 0},
 'May_2019_entity2_flag': {0: 0, 1: 0},
 'June_2019_entity2_flag': {0: 0, 1: 0},
 'July_2018_entity2_value': {0: 0, 1: 0},
 'August_2018_entity2_value': {0: 0, 1: 0},
 'September_2018_entity2_value': {0: 0, 1: 0},
 'October_2018_entity2_value': {0: 0, 1: 0},
 'November_2018_entity2_value': {0: 0, 1: 0},
 'December_2018_entity2_value': {0: 0, 1: 0},
 'January_2019_entity2_value': {0: 0, 1: 0},
 'February_2019_entity2_value': {0: 0, 1: 0},
 'March_2019_entity2_value': {0: 0, 1: 0},
 'April_2019_entity2_value': {0: 0, 1: 0},
 'May_2019_entity2_value': {0: 0, 1: 0},
 'June_2019_entity2_value': {0: 0, 1: 0}}

我希望将其更改为以下格式,

在此处输入图像描述

我一直在尝试融化、pd.wide_to_long 等,但没有取得多大成功。有人可以帮我解决这个问题吗?

谢谢

标签: pythonpandas

解决方案


另一种方法stackpivot_table

s = df.set_index(['ID', 'Name']).stack().reset_index()

x = s['level_2'].str.split('_')

s['col1'] = x.str[0] + x.str[1]
s['col2'] = x.str[2] + x.str[3]

s.drop('level_2', 1).pivot_table(columns='col2', values=0, index=['Name', 'col1'])

推荐阅读