[英]Pandas Multiindex: convert Multiindex to a column and keep the first level hidden or as nan
[英]How do I convert one level of pandas MultiIndex column to a standalone column?
我有一個 dataframe 和一個 MultiIndex 列,它有兩個級別,如下所示:
import pandas as pd
df = pd.DataFrame(
np.arange(16).reshape(4,4),
columns=pd.MultiIndex.from_tuples(
(("ID1", "Field1"), ("ID1", "Field2"), ("ID2", "Field1"), ("ID2", "Field2"),))
)
df.insert(0, "Date", pd.bdate_range("2021-11-01", "2021-11-04"))
df
Date ID1 ID2
Field1 Field2 Field1 Field2
0 2021-11-01 0 1 2 3
1 2021-11-02 4 5 6 7
2 2021-11-03 8 9 10 11
3 2021-11-04 12 13 14 15
我正在嘗試將 MultiIndex 列的級別 0 轉換為另一個名為“ID”的列,以便 dataframe 看起來像這樣:
df1 = pd.DataFrame(
np.arange(16).reshape(8,2),
columns=["Field1", "Field2"]
)
df1.insert(0, "ID", ["ID1", "ID2"]*4)
df1.insert(0, "Date", pd.bdate_range("2021-11-01", "2021-11-04").repeat(2))
df1
Date ID Field1 Field2
0 2021-11-01 ID1 0 1
1 2021-11-01 ID2 2 3
2 2021-11-02 ID1 4 5
3 2021-11-02 ID2 6 7
4 2021-11-03 ID1 8 9
5 2021-11-03 ID2 10 11
6 2021-11-04 ID1 12 13
7 2021-11-04 ID2 14 15
我嘗試使用熔體 function
df.melt(col_level=0, id_vars=["日期"])
但這會將 Field1 和 Field2 組合成一列,而不是根據需要將它們作為單獨的列。
任何建議,將不勝感激。 謝謝!
您可以嘗試以下方法:
out = (df
.set_index('Date')
.stack(level=0)
.reset_index()
.rename({'level_1': 'ID'}, axis=1))
print(out)
它給:
Date ID Field1 Field2
0 2021-11-01 ID1 0 1
1 2021-11-01 ID2 2 3
2 2021-11-02 ID1 4 5
3 2021-11-02 ID2 6 7
4 2021-11-03 ID1 8 9
5 2021-11-03 ID2 10 11
6 2021-11-04 ID1 12 13
7 2021-11-04 ID2 14 15
這是另一種方式:
df = pd.pivot(df.melt(id_vars=['Date'], var_name=['ID','Fields']),index=['Date','ID'],columns='Fields', values='value').reset_index()
print(df)
output:
Fields Date ID Field1 Field2
0 2021-11-01 ID1 0 1
1 2021-11-01 ID2 2 3
2 2021-11-02 ID1 4 5
3 2021-11-02 ID2 6 7
4 2021-11-03 ID1 8 9
5 2021-11-03 ID2 10 11
6 2021-11-04 ID1 12 13
7 2021-11-04 ID2 14 15
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.