我有一个较大的数据框和一个只有一行的小数据框。
更大的那个
route TC2_37 ... TD25
value daily_change ... value daily_change
period ...
Aug 23 20339.0 4018.0 ... 26569.0 -951.0
Sep 23 19737.0 3037.0 ... 32725.0 -507.0
Oct 23 19821.0 1316.0 ... 38033.0 -18.0
Nov 23 20803.0 580.0 ... 40282.0 -188.0
Dec 23 22070.0 115.0 ... 42195.0 -148.0
Q3 23 18158.0 1891.0 ... 31269.0 -1102.0
Q4 23 20899.0 672.0 ... 40170.0 -117.0
Q1 24 16361.0 363.0 ... 37983.0 -125.0
Q2 24 14581.0 380.0 ... 28731.0 546.0
Q3 24 13029.0 415.0 ... 27840.0 628.0
Q4 24 16701.0 310.0 ... 33390.0 520.0
Cal 24 15168.0 367.0 ... 31986.0 393.0
Cal 25 13950.0 98.0 ... 30712.0 139.0
有些列未显示,但它们都具有相同的结构
小数据框看起来像这样:
route A6TCE BCTI BDTI MA2TCE ... TD7 TD8 TD25 V2TCE
period ...
2023-08-02 17134.0 720.0 821.0 28859.0 ... 9917.0 31700.0 10408.0 11800.0
小数据框比较大数据框有更多路线,
我希望创建一个新的数据框,其中小数据框作为第一行,但仅包含重叠的列(路线)。并且仅在“值”列下,而不是“daily_change”
route TC2_37 ... TD25
value daily_change ... value daily_change
period
2023-08-02 990.0 ... 10408.0
Aug 23 20339.0 4018.0 ... 26569.0 -951.0
Sep 23 19737.0 3037.0 ... 32725.0 -507.0
Oct 23 19821.0 1316.0 ... 38033.0 -18.0
Nov 23 20803.0 580.0 ... 40282.0 -188.0
Dec 23 22070.0 115.0 ... 42195.0 -148.0
Q3 23 18158.0 1891.0 ... 31269.0 -1102.0
Q4 23 20899.0 672.0 ... 40170.0 -117.0
Q1 24 16361.0 363.0 ... 37983.0 -125.0
Q2 24 14581.0 380.0 ... 28731.0 546.0
Q3 24 13029.0 415.0 ... 27840.0 628.0
Q4 24 16701.0 310.0 ... 33390.0 520.0
Cal 24 15168.0 367.0 ... 31986.0 393.0
Cal 25 13950.0 98.0 ... 30712.0 139.0
从字典中复制更大数据帧的这一部分:
{('TC2_37', 'value'): {'Aug 23': 20339.0, 'Sep 23': 19737.0, 'Oct 23': 19821.0, 'Nov 23': 20803.0, 'Dec 23': 22070.0, 'Q3 23': 18158.0, 'Q4 23': 20899.0, 'Q1 24': 16361.0, 'Q2 24': 14581.0, 'Q3 24': 13029.0, 'Q4 24': 16701.0, 'Cal 24': 15168.0, 'Cal 25': 13950.0},
('TC2_37', 'daily_change'): {'Aug 23': 4018.0, 'Sep 23': 3037.0, 'Oct 23': 1316.0, 'Nov 23': 580.0, 'Dec 23': 115.0, 'Q3 23': 1891.0, 'Q4 23': 672.0, 'Q1 24': 363.0, 'Q2 24': 380.0, 'Q3 24': 415.0, 'Q4 24': 310.0, 'Cal 24': 367.0, 'Cal 25': 98.0},
('TD25', 'value'): {'Aug 23': 26569.0, 'Sep 23': 32725.0, 'Oct 23': 38033.0, 'Nov 23': 40282.0, 'Dec 23': 42195.0, 'Q3 23': 31269.0, 'Q4 23': 40170.0, 'Q1 24': 37983.0, 'Q2 24': 28731.0, 'Q3 24': 27840.0, 'Q4 24': 33390.0, 'Cal 24': 31986.0, 'Cal 25': 30712.0},
('TD25', 'daily_change'): {'Aug 23': -951.0, 'Sep 23': -507.0, 'Oct 23': -18.0, 'Nov 23': -188.0, 'Dec 23': -148.0, 'Q3 23': -1102.0, 'Q4 23': -117.0, 'Q1 24': -125.0, 'Q2 24': 546.0, 'Q3 24': 628.0, 'Q4 24': 520.0, 'Cal 24': 393.0, 'Cal 25': 139.0}}
大数据框的列是多索引的,而小数据框的列是扁平的。合并需要兼容的列。 因此,要么压平大的,要么对小的进行多重索引。
在这里,对小数据帧进行多重索引:
输入数据:“更大的”数据框
Periods = ['Aug 23','Sep 23','Oct 23','Nov 23','Dec 23','Q3 23','Q4 23','Q1 24','Q2 24','Q3 24','Q4 24','Cal 24','Cal 25']
Routes = ['TC2_37', 'TD25']
Categories = ['value','daily_change']
Data = [[20339.0,4018.0,26569.0,-951.0],
[19737.0,3037.0,32725.0,-507.0],
[19821.0,1316.0,38033.0,-18.0],
[20803.0,580.0,40282.0,-188.0],
[22070.0,115.0,42195.0,-148.0],
[18158.0,1891.0,31269.0,-1102.0],
[20899.0,672.0,40170.0,-117.0],
[16361.0,363.0,37983.0,-125.0],
[14581.0,380.0,28731.0,546.0],
[13029.0,415.0,27840.0,628.0],
[16701.0,310.0,33390.0,520.0],
[15168.0,367.0,31986.0,393.0],
[13950.0,98.0,30712.0,139.0]]
DF = pd.DataFrame(index = pd.Index(Periods, name = 'periods'),
columns = pd.MultiIndex.from_product([Routes, Categories]),
data = Data)
DF
TC2_37 TD25
value daily_change value daily_change
periods
Aug 23 20339.0 4018.0 26569.0 -951.0
Sep 23 19737.0 3037.0 32725.0 -507.0
Oct 23 19821.0 1316.0 38033.0 -18.0
Nov 23 20803.0 580.0 40282.0 -188.0
Dec 23 22070.0 115.0 42195.0 -148.0
Q3 23 18158.0 1891.0 31269.0 -1102.0
Q4 23 20899.0 672.0 40170.0 -117.0
Q1 24 16361.0 363.0 37983.0 -125.0
Q2 24 14581.0 380.0 28731.0 546.0
Q3 24 13029.0 415.0 27840.0 628.0
Q4 24 16701.0 310.0 33390.0 520.0
Cal 24 15168.0 367.0 31986.0 393.0
Cal 25 13950.0 98.0 30712.0 139.0
输入数据:“小”数据框
routes = ['A6TCE','BCTI','BDTI','MA2TCE','TD7', 'TD8', 'TD25', 'V2TCE']
values = [17134.0, 720.0, 821.0, 28859.0,9917.0,31700.0,10408.0,11800.0]
category = ['value']
period = ['2023-08-02']
(1) 如果可以直接用多索引列创建:
df = pd.DataFrame(index = pd.Index(period, name = 'periods'),
columns = pd.MultiIndex.from_product([routes, category]),
data = [values])
df
A6TCE BCTI BDTI MA2TCE TD7 TD8 TD25 V2TCE
value value value value value value value value
periods
2023-08-02 17134.0 720.0 821.0 28859.0 9917.0 31700.0 10408.0 11800.0
(2) 如果您无法直接使用多索引列创建它,那么添加级别很简单:如何简单地将列级别添加到 pandas 数据框
df = pd.DataFrame(index = pd.Index(period, name = 'periods'),
columns = routes,
data = [values])
df
A6TCE BCTI BDTI MA2TCE TD7 TD8 TD25 V2TCE
periods
2023-08-02 17134.0 720.0 821.0 28859.0 9917.0 31700.0 10408.0 11800.0
# Add the level:
df.columns = pd.MultiIndex.from_product([df.columns, ['value']])
df
A6TCE BCTI BDTI MA2TCE TD7 TD8 TD25 V2TCE
value value value value value value value value
periods
2023-08-02 17134.0 720.0 821.0 28859.0 9917.0 31700.0 10408.0 11800.0
合并
一旦存在索引兼容性,合并就显而易见了:
pd.concat([DF, df], axis=0, join='inner')
输出:按要求,
TD25
value
periods
Aug 23 26569.0
Sep 23 32725.0
Oct 23 38033.0
Nov 23 40282.0
Dec 23 42195.0
Q3 23 31269.0
Q4 23 40170.0
Q1 24 37983.0
Q2 24 28731.0
Q3 24 27840.0
Q4 24 33390.0
Cal 24 31986.0
Cal 25 30712.0
2023-08-02 10408.0
对于将新行放在顶部的索引进行排序,您需要以同质时间单位重新表述其内容,即避免混合天、月或季度,最好使用日期时间格式。