簡體   English   中英

如何將兩個 pandas 數據幀合並為單個多索引 DataFrame?

[英]How to merge two pandas DataFrames into single Multi-Index DataFrame?

我有兩個相同索引的 DataFrame,但每個都代表我的完整數據集的不同方面。
例如:

import pandas as pd
from datetime import date

df_price = pd.DataFrame(
    index=pd.date_range(start=date(2021, 1, 1), end=date(2021, 1, 3), freq="D"),
    columns=["A", "B", "C"],
    data={"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]}
)
df_quantity = pd.DataFrame(
    index=pd.date_range(start=date(2021, 1, 1), end=date(2021, 1, 3), freq="D"),
    columns=["A", "B", "C"],
    data={"A": [9, 8, 7], "B": [6, 5, 4], "C": [3, 2, 1]}
)

我想要的是相當於這樣做:

index = pd.MultiIndex.from_product([["A", "B", "C"], ["price", "quantity"]], names=["first", "second"])
df_total = pd.DataFrame(
    index=pd.date_range(start=date(2021, 1, 1), end=date(2021, 1, 3), freq="D"),
    columns=index,
    data=[[1, 9, 4, 6, 7, 3], [2, 8, 5, 5, 8, 2], [3, 7, 6, 4, 9, 1]]
)
first          A              B              C         
second     price quantity price quantity price quantity
2021-01-01     1        9     4        6     7        3
2021-01-02     2        8     5        5     8        2
2021-01-03     3        7     6        4     9        1

有任何想法嗎? 我已經嘗試過加入和合並的常用方法,但我所能做的就是添加帶有后綴的列。

一種選擇:

(i) join兩個 DataFrame

(ii) 在'_'上拆分列名,因為我們想使用from_tuples , map 子列表到元組

(iii) 使用pd.MultiIndex將列轉換為 MultiIndex

(iv) 對列名進行排序以匹配所需的結果

df_total = df_price.join(df_quantity, lsuffix='_price', rsuffix='_quantity')
df_total.columns = pd.MultiIndex.from_tuples(map(tuple, df_total.columns.str.split('_')))
df_total = df_total.reindex(df_total.columns.sort_values(), axis=1)

Output:

               A              B              C         
           price quantity price quantity price quantity
2021-01-01     1        9     4        6     7        3
2021-01-02     2        8     5        5     8        2
2021-01-03     3        7     6        4     9        1

我查看了concatenate()方法並找到了這個答案 它讓我創建了一個 function 來解決我的問題。 它可以一次處理多個DataFrame對象

from typing import Dict
import pandas as pd

def in_merge(dfs_dict: Dict[str, pd.DataFrame]) -> pd.DataFrame:
    return (
        pd.concat(
            dfs_dict,
            axis=1,
            names=["attribute", "item"],
        )
        .swaplevel(axis=1)
        .sort_index(axis=1)
    )
|                     |   ('A', 'price') |   ('A', 'quality') |   ('A', 'quantity') |   ('B', 'price') |   ('B', 'quality') |   ('B', 'quantity') |   ('C', 'price') |   ('C', 'quality') |   ('C', 'quantity') |
|:--------------------|-----------------:|-------------------:|--------------------:|-----------------:|-------------------:|--------------------:|-----------------:|-------------------:|--------------------:|
| 2021-01-01 00:00:00 |                1 |                  4 |                   9 |                4 |                  5 |                   6 |                7 |                  6 |                   3 |
| 2021-01-02 00:00:00 |                2 |                  4 |                   8 |                5 |                  5 |                   5 |                8 |                  6 |                   2 |
| 2021-01-03 00:00:00 |                3 |                  4 |                   7 |                6 |                  5 |                   4 |                9 |                  6 |                   1 |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM