我正在尝试进行某种形式的逆转置,其中ID(ISIN)成为重复项,但是特征“ Period”定义了时间段,而值特征从3个特征变为相同的特征。如何在Python中从dfs升级到dfs2?
dfs = pd.DataFrame({
'ISIN': [
'A', 'B', 'C'
],
'Std3y': [
0.10, 0.11, 0.15
],
'Std5y': [
0.14, 0.10, 0.18
],
'Std8y': [
0.17, 0.19, 0.11
],
})
dfs
dfs2 = pd.DataFrame({
'ISIN': [
'A', 'A', 'A',
'B', 'B', 'B',
'C', 'C', 'C'
],
'Period': [
'3y', '5y', '8y',
'3y', '5y', '8y',
'3y', '5y', '8y'
],
'Std': [
0.10, 0.14, 0.17,
0.11, 0.10, 0.19,
0.15, 0.18, 0.11
]
})
dfs2
答案 0 :(得分:1)
您可以使用pd.melt
来“取消透视”数据框,然后使用字符串切片:
res = pd.melt(dfs, id_vars='ISIN', value_vars=dfs.columns[1:].tolist())
res['variable'] = res['variable'].str[3:]
print(res)
ISIN variable value
0 A 3y 0.10
1 B 3y 0.11
2 C 3y 0.15
3 A 5y 0.14
4 B 5y 0.10
5 C 5y 0.18
6 A 8y 0.17
7 B 8y 0.19
8 C 8y 0.11
答案 1 :(得分:0)
将set_index
与unstack
一起使用,并通过swaplevel
,sort_index
和reset_index
进行一些数据清理:
df = dfs.set_index('ISIN')
df.columns = df.columns.str[3:]
df = (df.unstack()
.swaplevel(0,1)
.sort_index()
.rename_axis(['ISIN','Period'])
.reset_index(name='Std'))
print (df)
ISIN Period Std
0 A 3y 0.10
1 A 5y 0.14
2 A 8y 0.17
3 B 3y 0.11
4 B 5y 0.10
5 B 8y 0.19
6 C 3y 0.15
7 C 5y 0.18
8 C 8y 0.11