修改矩阵 df 格式
Modify matrix df format
有一个 df 为:
14 15 16
14 10.1166 18.2331 65.0185
15 18.2331 6.664 57.5195
16 65.3499 57.851 20.9907
有什么不同的更有效的方法来修改 df 以使其看起来像
a b c
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.664
etc.
我写了这段代码,但我不喜欢我需要为它使用循环的事实。
for row in tt.index:
row_vals = tt[tt.index==row]
col_vals = row_vals.T
col_vals['from_zone'] = row
col_vals['to_zone'] = tt.index
col_vals['travel_time'] = col_vals[row].astype('int')
col_vals = col_vals.drop(row, axis=1)
travel_data = pd.concat([travel_data,col_vals])
In [58]: df.stack().reset_index().rename(columns={'level_0':'a','level_1':'b',0:'c'})
Out[58]:
a b c
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.6640
5 15 16 57.5195
6 16 14 65.3499
7 16 15 57.8510
8 16 16 20.9907
一步一步:
In [59]: df.stack()
Out[59]:
14 14 10.1166
15 18.2331
16 65.0185
15 14 18.2331
15 6.6640
16 57.5195
16 14 65.3499
15 57.8510
16 20.9907
dtype: float64
In [60]: df.stack().reset_index()
Out[60]:
level_0 level_1 0
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.6640
5 15 16 57.5195
6 16 14 65.3499
7 16 15 57.8510
8 16 16 20.9907
使用 stack
和 rename
作为列名
In [620]: df.stack().reset_index(name='c').rename(columns={'level_0': 'a', 'level_1': 'b'})
Out[620]:
a b c
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.6640
5 15 16 57.5195
6 16 14 65.3499
7 16 15 57.8510
8 16 16 20.9907
让我们使用 rename_axis
、reset_index
和 melt
:
df.rename_axis('a').reset_index().melt(id_vars='a',var_name='b',value_name='c')
输出:
a b c
0 14 14 10.1166
1 15 14 18.2331
2 16 14 65.3499
3 14 15 18.2331
4 15 15 6.6640
5 16 15 57.8510
6 14 16 65.0185
7 15 16 57.5195
8 16 16 20.9907
有一个 df 为:
14 15 16
14 10.1166 18.2331 65.0185
15 18.2331 6.664 57.5195
16 65.3499 57.851 20.9907
有什么不同的更有效的方法来修改 df 以使其看起来像
a b c
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.664
etc.
我写了这段代码,但我不喜欢我需要为它使用循环的事实。
for row in tt.index:
row_vals = tt[tt.index==row]
col_vals = row_vals.T
col_vals['from_zone'] = row
col_vals['to_zone'] = tt.index
col_vals['travel_time'] = col_vals[row].astype('int')
col_vals = col_vals.drop(row, axis=1)
travel_data = pd.concat([travel_data,col_vals])
In [58]: df.stack().reset_index().rename(columns={'level_0':'a','level_1':'b',0:'c'})
Out[58]:
a b c
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.6640
5 15 16 57.5195
6 16 14 65.3499
7 16 15 57.8510
8 16 16 20.9907
一步一步:
In [59]: df.stack()
Out[59]:
14 14 10.1166
15 18.2331
16 65.0185
15 14 18.2331
15 6.6640
16 57.5195
16 14 65.3499
15 57.8510
16 20.9907
dtype: float64
In [60]: df.stack().reset_index()
Out[60]:
level_0 level_1 0
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.6640
5 15 16 57.5195
6 16 14 65.3499
7 16 15 57.8510
8 16 16 20.9907
使用 stack
和 rename
作为列名
In [620]: df.stack().reset_index(name='c').rename(columns={'level_0': 'a', 'level_1': 'b'})
Out[620]:
a b c
0 14 14 10.1166
1 14 15 18.2331
2 14 16 65.0185
3 15 14 18.2331
4 15 15 6.6640
5 15 16 57.5195
6 16 14 65.3499
7 16 15 57.8510
8 16 16 20.9907
让我们使用 rename_axis
、reset_index
和 melt
:
df.rename_axis('a').reset_index().melt(id_vars='a',var_name='b',value_name='c')
输出:
a b c
0 14 14 10.1166
1 15 14 18.2331
2 16 14 65.3499
3 14 15 18.2331
4 15 15 6.6640
5 16 15 57.8510
6 14 16 65.0185
7 15 16 57.5195
8 16 16 20.9907