python - Pandas:如何将 MultiIndex DataFrame 与单个索引 DataFrame 连接起来,以及自定义排序

标签 python pandas join merge concatenation

我有一个 MultiIndex pandas DataFrame df_multi 像:

import pandas as pd

df_multi = pd.DataFrame([['A', 'A1', 0,234,2002],['A', 'A1', 1,324,2550],
['A', 'A1', 2,345,3207],['A', 'A1', 3,458,4560],['A', 'A2', 0,569,1980],
['A', 'A2', 1,657,2314],['A', 'A2', 2,768,4568],['A', 'A2', 3,823,5761]], 
columns=['Product','Scenario','Time','Quantity','Price']).set_index(
['Product', 'Scenario'])
和单个索引 DataFrame df_single 如:
df_single = pd.DataFrame([['A', -3,100],['A', -2,100], ['A', -1,100]],
columns=['Product','Time','Quantity']).set_index(['Product'])
对于 df_multi 的第一个索引级别中的每个“产品”,以及其第二个级别中的每个“场景”,我想附加/连接 df_single 中的行,其中包含一些要附加在正值之前的负值“时间”值df_multi 中的“时间”值开始。
此外,我希望生成的 DataFrame 首先由 ['Product','Scenario'] 进行多索引(就像 df_multi ),然后按“Time”的升序值对行进行排序。换句话说,想要的结果是:
df_result = pd.DataFrame([['A', 'A1', -3,100,'NaN'],['A', 'A1', -2,100,'NaN'],
['A', 'A1', -1,100,'NaN'],['A', 'A1', 0,234,2002],['A', 'A1', 1,324,2550],
['A', 'A1', 2,345,3207],['A', 'A1', 3,458,4560],['A','A2', -3,100,'NaN'],
['A', 'A2', -2,100,'NaN'],['A', 'A2', -1,100,'NaN'],['A', 'A2', 0,569,1980],
['A', 'A2', 1,657,2314],['A', 'A2', 2,768,4568],['A', 'A2', 3,823,5761]],
columns=['Product','Scenario','Time','Quantity','Price']).set_index(
['Product', 'Scenario'])
编辑:
  • df_single 没有“场景”值,这可能会令人困惑。只要 'Product' 匹配,相同的 df_single 行将被附加到 df_multi 中的每个场景,并且它们只是免费“继承”场景值。
  • 我正在使用的实际数据帧相当大(每个产品几千个“产品”,几千个“场景”,每个场景几百个“时间”步骤,以及我没有在示例中写的额外列) ,所以我需要以完全自动化的(希望是快速的)方式来做到这一点。

  • 我试图用所有 joinconcatmerge 来实现这一点,但我没有成功。达到预期结果的最佳方法是什么?

    最佳答案

    考虑将索引重置为 merge 的列,然后是 groupby 聚合,只为每组返回一次并避免重复。之后,运行串联 concat ,然后进行列排序并设置多索引。

    # MERGE AND AGGREGATION
    df_temp = df_multi.reset_index().merge(df_single.reset_index(), on='Product', suffixes=['','_'])\
                                    .groupby(['Product', 'Scenario', 'Time_'])['Quantity_'].max()\
                                    .reset_index().rename(columns={'Time_':'Time','Quantity_':'Quantity'})
    
    # ROW BIND CONCATENATION
    df_final = pd.concat([df_multi.reset_index(), df_temp])\
                        .sort_values(['Product','Scenario', 'Time'])\
                        .set_index(['Product', 'Scenario'])[['Time', 'Quantity', 'Price']]
    print(df_final)
    #                   Time  Quantity   Price
    # Product Scenario                        
    # A       A1          -3       100     NaN
    #         A1          -2       100     NaN
    #         A1          -1       100     NaN
    #         A1           0       234  2002.0
    #         A1           1       324  2550.0
    #         A1           2       345  3207.0
    #         A1           3       458  4560.0
    #         A2          -3       100     NaN
    #         A2          -2       100     NaN
    #         A2          -1       100     NaN
    #         A2           0       569  1980.0
    #         A2           1       657  2314.0
    #         A2           2       768  4568.0
    #         A2           3       823  5761.0
    

    关于python - Pandas:如何将 MultiIndex DataFrame 与单个索引 DataFrame 连接起来,以及自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47561694/

    相关文章:

    python - 在 opengl 中混合 2d 和 3d(使用 pyglet)

    Python Merge 2 or more Dicts using a value to handle duplicate keys

    python - 根据列值选择用户 - pandas dataframe

    MySQL 查询从多个表返回 OR-inclusive 关系

    c# - DataTable Linq 连接多列

    python - selenium - WebDriverWait().until(myFunc) 可以使用 WebDriver 之外的函数吗?

    php - 将 Python 代码转换为 PHP

    python - 从 pandas.DataFrame 的每一列中获取最大的值

    python - 如何将多列乘以 Pandas 中的一列

    database - 数据库管理系统 : Relational Algebra Execution Plan Cost Calculation