如何解决 Python 中的 'transpose'?
How do I solve this 'transpose' in Python?
我正在尝试进行某种反向转置,其中 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
您可以使用 pd.melt
到 "unpivot" 您的数据框,然后使用字符串切片:
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
使用set_index
with unstack
and some data cleaning by swaplevel
, sort_index
and 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
我正在尝试进行某种反向转置,其中 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
您可以使用 pd.melt
到 "unpivot" 您的数据框,然后使用字符串切片:
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
使用set_index
with unstack
and some data cleaning by swaplevel
, sort_index
and 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