如何合并多索引列datafram

2024-06-30 14:08:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想合并静态数据和时变数据。你知道吗

第一个数据帧

a_columns = pd.MultiIndex.from_product([["A","B","C"],["1","2"]])
a_index = pd.date_range("20100101","20110101",freq="BM")
a = pd.DataFrame(columns=a_columns,index=a_index)#A

第二数据帧

b_columns = ["3","4","5"]
b_index = ["A","B","C"]
b = pd.DataFrame(columns=b_columns,index=b_index)

我该怎么把这两个结合起来?我想要的数据帧的形式是一个,但是有额外的列。你知道吗

谢谢!你知道吗


Tags: columns数据fromdataframedateindexrangeproduct
1条回答
网友
1楼 · 发布于 2024-06-30 14:08:38

我认为您需要通过^{}重塑,然后通过^{}创建df,因为concat需要Datetimeindex,所以新索引是从a索引的第一个值开始的。你知道吗

最后^{}+^{}

#added some data - 2
a_columns = pd.MultiIndex.from_product([["A","B","C"],["1","2"]])
a_index = pd.date_range("20100101","20110101",freq="BM")
a = pd.DataFrame(2,columns=a_columns,index=a_index)#A

#added some data - 1
b_columns = ["3","4","5"]
b_index = ["A","B","C"]
b = pd.DataFrame(1,columns=b_columns,index=b_index)

c = b.stack().to_frame(a.index[0]).T
print (c)
            A        B        C      
            3  4  5  3  4  5  3  4  5
2010-01-29  1  1  1  1  1  1  1  1  1

d = pd.concat([a,c], axis=1).sort_index(axis=1)
print (d)
            A                    B                    C                  
            1  2    3    4    5  1  2    3    4    5  1  2    3    4    5
2010-01-29  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-02-26  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-03-31  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-04-30  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-05-31  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-06-30  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-07-30  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-08-31  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-09-30  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-10-29  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-11-30  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN
2010-12-31  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN  2  2  NaN  NaN  NaN

Last if need将添加列中的NaN替换为第一行:

d[c.columns] = d[c.columns].ffill()
print (d)
            A                    B                    C                  
            1  2    3    4    5  1  2    3    4    5  1  2    3    4    5
2010-01-29  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-02-26  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-03-31  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-04-30  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-05-31  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-06-30  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-07-30  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-08-31  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-09-30  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-10-29  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-11-30  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0
2010-12-31  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0  2  2  1.0  1.0  1.0

^{}类似的解决方案:

c = b.stack().to_frame(a.index[0]).T.reindex(a.index, method='ffill')
print (c)
            A        B        C      
            3  4  5  3  4  5  3  4  5
2010-01-29  1  1  1  1  1  1  1  1  1
2010-02-26  1  1  1  1  1  1  1  1  1
2010-03-31  1  1  1  1  1  1  1  1  1
2010-04-30  1  1  1  1  1  1  1  1  1
2010-05-31  1  1  1  1  1  1  1  1  1
2010-06-30  1  1  1  1  1  1  1  1  1
2010-07-30  1  1  1  1  1  1  1  1  1
2010-08-31  1  1  1  1  1  1  1  1  1
2010-09-30  1  1  1  1  1  1  1  1  1
2010-10-29  1  1  1  1  1  1  1  1  1
2010-11-30  1  1  1  1  1  1  1  1  1
2010-12-31  1  1  1  1  1  1  1  1  1

d = pd.concat([a,c], axis=1).sort_index(axis=1)
print (d)
            A              B              C            
            1  2  3  4  5  1  2  3  4  5  1  2  3  4  5
2010-01-29  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-02-26  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-03-31  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-04-30  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-05-31  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-06-30  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-07-30  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-08-31  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-09-30  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-10-29  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-11-30  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1
2010-12-31  2  2  1  1  1  2  2  1  1  1  2  2  1  1  1

相关问题 更多 >