我有一个较大的数据帧和一个只有一行的小数据帧.

更大的那个

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

有些列没有显示,但它们都具有相同的 struct

小型数据帧如下所示:

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

The small dataframe has more routes than 更大的那个,

我希望创建一个新的数据帧,它将小数据帧作为第一行,但只有重叠的列(路由).并且只在"Value"栏下,而不是"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

从DICT复制更 Big Data 帧的这一部分:

{('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}}

推荐答案

大型数据帧的列是多索引的,而小型数据帧的列是平面的.合并需要兼容的列. 因此,要么扁平化大的,要么多指数化小的.

这里,对小数据帧进行多索引:

Input data: "bigger" dataframe

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

Input data: "small" dataframe

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)如果不能使用多索引列直接创建标高,则添加标高很简单:How to simply add a column level to a pandas dataframe

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

Merging

一旦索引兼容,合并就很明显了:

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

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

Python相关问答推荐

如何将Pydantic URL验证限制为特定主机或网站

customtkinter中使用的这个小部件的名称是什么

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

如何防止Plotly在输出到PDF时减少行中的点数?

如何根据情况丢弃大Pandas 的前n行,使大Pandas 的其余部分完好无损

如何根据条件在多指标框架上进行groupby

如何使用Jinja语法在HTML中重定向期间传递变量?

在内部列表上滚动窗口

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

在线条上绘制表面

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

如何使用数组的最小条目拆分数组

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

Python—从np.array中 Select 复杂的列子集

如何保持服务器发送的事件连接活动?

启用/禁用shiny 的自动重新加载

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

使用BeautifulSoup抓取所有链接

幂集,其中每个元素可以是正或负""""

Pandas:填充行并删除重复项,但保留不同的值