重新排序数据透视 table 并删除多索引
Reordering of pivot table and removing multi-indexing
数据框
TYPE WEEK VALUE1 VALUE2
0 Type1 1 1 1
1 Type2 2 2 2
2 Type3 3 3 3
3 Type4 4 4 4
import pandas as pd
import numpy as np
df = {'TYPE' : pd.Series(['Type1','Type2','Type3','Type4']),
'WEEK' : pd.Series([1, 2, 3, 4]),
'VALUE1' : pd.Series([1, 2, 3, 4]),
'VALUE2' : pd.Series([1, 2, 3, 4])
}
df = pd.DataFrame(df)
df = pd.pivot_table(df,index="TYPE",columns="WEEK", values=['VALUE1','VALUE2']).reset_index()
df2 = df.swaplevel(0,1,axis=1).reset_index()
输出
WEEK index 1 2 3 4 1 2 3 4
TYPE VALUE1 VALUE1 VALUE1 VALUE1 VALUE2 VALUE2 VALUE2 VALUE2
0 0 Type1 1.0 NaN NaN NaN 1.0 NaN NaN NaN
1 1 Type2 NaN 2.0 NaN NaN NaN 2.0 NaN NaN
2 2 Type3 NaN NaN 3.0 NaN NaN NaN 3.0 NaN
3 3 Type4 NaN NaN NaN 4.0 NaN NaN NaN 4.0
预期结构输出
WEEK TYPE | VALUE11 VALUE21 | VALUE12 VALUE22 | VALUE13 VALUE23 | VALUE14 VALUE24
0 Type1 | | | |
1 Type2 | | | |
2 Type3 | | | |
3 Type4 | | | |
思路:
- 重新排序结构。 (我试过
swaplevel()
如上所述,但无法达到预期的输出)
- 加入列名,例如。 “Value11”由“Value1”+“1”
我浏览了互联网上的几个示例,但无法得出任何结论。
尝试:
# Pivot without resetting index
df = pd.pivot_table(df,index="TYPE",columns="WEEK", values=['VALUE1','VALUE2']).sort_index(level=1, axis=1)
# Rename columns
df.columns = [f"{l1}{l2}" for l1, l2 in df.columns.tolist()]
输出:
>>> df.reset_index()
VALUE11 VALUE21 VALUE12 VALUE22 VALUE13 VALUE23 VALUE14 VALUE24
TYPE
Type1 1.0 1.0 NaN NaN NaN NaN NaN NaN
Type2 NaN NaN 2.0 2.0 NaN NaN NaN NaN
Type3 NaN NaN NaN NaN 3.0 3.0 NaN NaN
Type4 NaN NaN NaN NaN NaN NaN 4.0 4.0
IIUC,你可以使用:
df2 = (df.pivot_table(index="TYPE",columns="WEEK", values=['VALUE1','VALUE2'])
.sort_index(level=1, axis=1)
)
df2.columns = df2.columns.map(lambda x: x[0]+str(x[1]))
df2.reset_index()
输出:
TYPE VALUE11 VALUE21 VALUE12 VALUE22 VALUE13 VALUE23 VALUE14 VALUE24
0 Type1 1.0 1.0 NaN NaN NaN NaN NaN NaN
1 Type2 NaN NaN 2.0 2.0 NaN NaN NaN NaN
2 Type3 NaN NaN NaN NaN 3.0 3.0 NaN NaN
3 Type4 NaN NaN NaN NaN NaN NaN 4.0 4.0
数据框
TYPE WEEK VALUE1 VALUE2
0 Type1 1 1 1
1 Type2 2 2 2
2 Type3 3 3 3
3 Type4 4 4 4
import pandas as pd
import numpy as np
df = {'TYPE' : pd.Series(['Type1','Type2','Type3','Type4']),
'WEEK' : pd.Series([1, 2, 3, 4]),
'VALUE1' : pd.Series([1, 2, 3, 4]),
'VALUE2' : pd.Series([1, 2, 3, 4])
}
df = pd.DataFrame(df)
df = pd.pivot_table(df,index="TYPE",columns="WEEK", values=['VALUE1','VALUE2']).reset_index()
df2 = df.swaplevel(0,1,axis=1).reset_index()
输出
WEEK index 1 2 3 4 1 2 3 4
TYPE VALUE1 VALUE1 VALUE1 VALUE1 VALUE2 VALUE2 VALUE2 VALUE2
0 0 Type1 1.0 NaN NaN NaN 1.0 NaN NaN NaN
1 1 Type2 NaN 2.0 NaN NaN NaN 2.0 NaN NaN
2 2 Type3 NaN NaN 3.0 NaN NaN NaN 3.0 NaN
3 3 Type4 NaN NaN NaN 4.0 NaN NaN NaN 4.0
预期结构输出
WEEK TYPE | VALUE11 VALUE21 | VALUE12 VALUE22 | VALUE13 VALUE23 | VALUE14 VALUE24
0 Type1 | | | |
1 Type2 | | | |
2 Type3 | | | |
3 Type4 | | | |
思路:
- 重新排序结构。 (我试过
swaplevel()
如上所述,但无法达到预期的输出) - 加入列名,例如。 “Value11”由“Value1”+“1” 我浏览了互联网上的几个示例,但无法得出任何结论。
尝试:
# Pivot without resetting index
df = pd.pivot_table(df,index="TYPE",columns="WEEK", values=['VALUE1','VALUE2']).sort_index(level=1, axis=1)
# Rename columns
df.columns = [f"{l1}{l2}" for l1, l2 in df.columns.tolist()]
输出:
>>> df.reset_index()
VALUE11 VALUE21 VALUE12 VALUE22 VALUE13 VALUE23 VALUE14 VALUE24
TYPE
Type1 1.0 1.0 NaN NaN NaN NaN NaN NaN
Type2 NaN NaN 2.0 2.0 NaN NaN NaN NaN
Type3 NaN NaN NaN NaN 3.0 3.0 NaN NaN
Type4 NaN NaN NaN NaN NaN NaN 4.0 4.0
IIUC,你可以使用:
df2 = (df.pivot_table(index="TYPE",columns="WEEK", values=['VALUE1','VALUE2'])
.sort_index(level=1, axis=1)
)
df2.columns = df2.columns.map(lambda x: x[0]+str(x[1]))
df2.reset_index()
输出:
TYPE VALUE11 VALUE21 VALUE12 VALUE22 VALUE13 VALUE23 VALUE14 VALUE24
0 Type1 1.0 1.0 NaN NaN NaN NaN NaN NaN
1 Type2 NaN NaN 2.0 2.0 NaN NaN NaN NaN
2 Type3 NaN NaN NaN NaN 3.0 3.0 NaN NaN
3 Type4 NaN NaN NaN NaN NaN NaN 4.0 4.0