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

乔恩

我有一个 MultiIndex pandas DataFramedf_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'])

和单个索引数据帧,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,并且它们只是免费“继承”场景值。
  • 我正在使用的实际数据帧相当大(每个产品几千个“产品”,几千个“场景”,每个场景几百个“时间”步骤,加上我没有在示例中写的额外列),所以我需要以完全自动化的(希望是快速的)方式来做到这一点。

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

完美的

考虑将索引重置为 a 的列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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫MultiIndex DataFrame排序

根据列值对具有MultiIndex的pandas DataFrame进行排序

慢熊猫DataFrame MultiIndex重新索引

索引与MultiIndex的Pandas Dataframe日期时间切片

筛选MultiIndex Pandas DataFrame

如何将Pandas Dataframe MultiIndex行转换为MultiIndex列?

如何通过MultiIndex和值对Pandas DataFrame进行排序?

列计算中的Pandas MultiIndex DataFrame参考索引值

将空的Pandas DataFrame与Multiindex DataFrame连接起来

如何根据multiIndex DataFrame的内部索引执行操作?

具有MultiIndex列的Pandas DataFrame中的布尔索引

如何切片具有MultiIndex索引和MultiIndex列的Pandas DataFrame?

如何将json读取到熊猫MultiIndex Dataframe?

Pandas Dataframe Mul在Multiindex上

使用MultiIndex索引到Pandas DataFrame时保持顺序吗?

在Pandas Dataframe中查询Multiindex-特殊索引

将平面索引与分层索引的DataFrame连接起来

如何将pandas DataFrame的值用作numpy数组索引

使用MultiIndex在DataFrame上建立索引

按MultiIndex的一级对pandas DataFrame进行排序

如何在MultiIndex Pandas DataFrame中设置索引值?

Pandas - 使用 MultiIndex DataFrame 的索引切入 DataFrame

更新 Pandas MultiIndex DataFrame

Matplotlib:pandas MultiIndex DataFrame 的自定义代码

在 Pandas MultiIndex DataFrame 上建立索引时出现 KeyError

使用 Spark Dataframe 遍历记录并根据某些条件将当前值与先前值连接起来

如何将字符串列表与自定义小部件连接起来

如何将列表元素与 Pandas DataFrame 中的索引匹配

如何将 Pandas DataFrame 更改为列多索引?