<p><strong><em>设置</em></strong></p>
<pre><code>dct = {'Cust_No': {0: 1, 1: 2},
'Measure1_month1': {0: 10, 1: 20},
'Measure1_month2': {0: 20, 1: 40},
'Measure1_month72': {0: 500, 1: 800},
'Measure2_month_1': {0: 40, 1: 70},
'Measure2_month_2': {0: 50, 1: 150}}
df = pd.DataFrame(dct)
</code></pre>
<hr/>
<p>有很多争论,但一般来说:将列拆分为多索引,然后堆叠。您需要的第二种格式是第一种格式的轴心</p>
<hr/>
<pre><code>d = df.set_index('Cust_No')
d.columns = d.columns.str.replace('month\_', 'month').str.split('_', expand=True)
u = d.stack((0, 1)).rename_axis(
['Cust_No', 'Measure', 'Month']).to_frame('Value').reset_index()
f1 = u.assign(Month=u.Month.str.extract(r'(\d+)')[0])
f2 = f1.pivot_table(
index=['Cust_No', 'Month'], columns='Measure', values='Value', fill_value=0)
</code></pre>
<hr/>
<p><strong><em>输出</em></strong></p>
<pre><code>>>> f1
Cust_No Measure Month Value
0 1 Measure1 1 10.0
1 1 Measure1 2 20.0
2 1 Measure1 72 500.0
3 1 Measure2 1 40.0
4 1 Measure2 2 50.0
5 2 Measure1 1 20.0
6 2 Measure1 2 40.0
7 2 Measure1 72 800.0
8 2 Measure2 1 70.0
9 2 Measure2 2 150.0
>>> f2
Measure Measure1 Measure2
Cust_No Month
1 1 10 40
2 20 50
72 500 0
2 1 20 70
2 40 150
72 800 0
</code></pre>