【问题标题】:making pandas multiple data frames with multi-indexed columns and join altogether使熊猫具有多索引列的多个数据框并完全连接
【发布时间】:2020-12-03 14:08:09
【问题描述】:

有些人会说这需要是两个独立的问题,但它们是相互关联的,所以我把它们都写在这里。

1.制作多索引列

我有三个数据框:

data_large = pd.DataFrame({"name":["a", "b", "c"], "sell":[10, 60, 50], "buy":[20, 30, 40]})
data_mini = pd.DataFrame({"name":["b", "c", "d"], "sell":[60, 20, 10], "buy":[30, 50, 40]})
data_topix = pd.DataFrame({"name":["a", "b", "c"], "sell":[10, 80, 0], "buy":[70, 30, 40]})

但首先,我想让他们的列像下面那样被多索引。

这是我尝试过的,但没有按预期工作。 name 低于索引级别 Nikkei225Large

iterables = [['Nikkei225Large'], ['name', 'buy', 'sell']]
index_large = pd.MultiIndex.from_product(iterables, names=['product', 'sell_buy'])
data_large.columns = index_large

2。使用多索引列连接多个 pandas,例如。使用reduce

接下来,在name 列上将三个数据框一起外连接。预期的输出是:

目前,我只是使用reduce 加入他们,如下所示,但我想使用多索引列。

from functools import reduce
dfs = {0: data_large, 1: data_mini, 2: data_topix}

def agg_df(dfList):
    df_agged = reduce(lambda left, right: pd.merge(left, right, 
                                                   left_index=True, right_index=True, 
                                                   on='name',
                                                   how='outer'), dfList)
    return df_agged

df_final = agg_df(dfs.values())

任何帮助将不胜感激!

【问题讨论】:

    标签: pandas join reduce multi-index


    【解决方案1】:

    IIUC,您可以使用 pd.concatkeys 参数来做到这一点:

    df_out = pd.concat([dfi.set_index('name') for dfi in [data_large, data_mini, data_topix]], 
                       keys=['Nikkei225Large', 'Nikkei225Mini', 'Topix'], axis=1)\
               .rename_axis(index=['Name'], columns=['product','buy_sell'])
    

    输出:

    product  Nikkei225Large       Nikkei225Mini       Topix      
    buy_sell           sell   buy          sell   buy  sell   buy
    Name                                                         
    a                  10.0  20.0           NaN   NaN  10.0  70.0
    b                  60.0  30.0          60.0  30.0  80.0  30.0
    c                  50.0  40.0          20.0  50.0   0.0  40.0
    d                   NaN   NaN          10.0  40.0   NaN   NaN
    

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 2023-02-10
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 2017-09-21
      • 2020-11-27
      相关资源
      最近更新 更多