将数据帧与最初不匹配的索引结构(列)连接起来

问题描述 投票:0回答:1

我有一个较大的数据框和一个只有一行的小数据框。

更大的那个

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}}
python pandas dataframe merge multi-index
1个回答
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

对于将新行放在顶部的索引进行排序,您需要以同质时间单位重新表述其内容,即避免混合天、月或季度,最好使用日期时间格式。

© www.soinside.com 2019 - 2024. All rights reserved.