【问题标题】:join dataframes and create a multiindex加入数据框并创建多索引
【发布时间】:2021-05-10 17:34:23
【问题描述】:

假设我有 2 个相同形状的数据框。在每个数据框的第一列中,我有一个产品 ID(变体项目的父项),在以下列中,我有一些数据(预处理的产品特征/编号),这在两个数据框和最后一列中是不同的我有专业产品的变体项目的总量(从子到父产品 ID)

第一个数据帧:

dfaa = pd.DataFrame([['id1', 1, 2, 3, 3], ['id2',4, 5, 6,6 ], ['id3', 7, 8, 9,9]], columns=['prod_id','a', 'b','c','number of prod variants'])

第二个数据帧:

dfbb = pd.DataFrame([['id1', 1.1, 2.2, 3.3, 3], ['id2',4.4, 5.4, 6.6,6 ], ['id3', 7.7, 8.8, 9.9,9]], columns=['prod_id','a', 'b','c','number of prod variants'])

我需要做的是加入这些数据帧以形成一个具有多索引的数据帧,如下所示:

第一个选项是每个特征的额外索引级别,该级别由较低级别的两列组成,用于来自 2 个原始数据帧的两个值。我能想到的第二个选项就是沿列连接特征,然后添加一个额外的索引级别来描述数字(非 NaN 值和唯一值)。

对于第一个选项,可能需要修改较低索引级别的列的名称(例如,我可以使用 a_vals 和 a_unique 代替 a 和 a) - 这没问题。

非常努力地在 python 中处理数据,非常感谢您的帮助。

【问题讨论】:

标签: python pandas dataframe multi-index


【解决方案1】:

查看您的目标结构之一,它可以由stack()unstack() 构建

dfaa = pd.DataFrame([['id1', 1, 2, 3, 3], ['id2',4, 5, 6,6 ], ['id3', 7, 8, 9,9]], columns=['prod_id','a', 'b','c','number of prod variants'])
dfbb = pd.DataFrame([['id1', 1.1, 2.2, 3.3, 3], ['id2',4.4, 5.4, 6.6,6 ], ['id3', 7.7, 8.8, 9.9,9]], columns=['prod_id','a', 'b','c','number of prod variants'])

def prepdf(df, cat):
    return (df.loc[:,[c for c in dfaa.columns if "number" not in c]]
     .set_index("prod_id")
     .stack()
     .to_frame()
     .assign(cat=cat)
    )

dfm = (pd.concat([
    prepdf(dfaa, "VALS"),
    prepdf(dfbb, "V_UN")])
 .set_index("cat", append=True)
 .unstack([2,1])
 .droplevel(0, axis=1)
 .join(dfbb.loc[:,["prod_id","number of prod variants"]]
       .set_index("prod_id")
      .rename(columns={"number of prod variants":("","number of prod variants")}))
)

输出

cat     VALS           V_UN                                  
           a    b    c    a    b    c number of prod variants
prod_id                                                      
id1      1.0  2.0  3.0  1.1  2.2  3.3                       3
id2      4.0  5.0  6.0  4.4  5.4  6.6                       6
id3      7.0  8.0  9.0  7.7  8.8  9.9                       9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-11-25
    • 1970-01-01
    • 2023-03-23
    • 2014-02-10
    • 2017-11-10
    • 2016-01-13
    相关资源
    最近更新 更多