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 条评论
登录 后参与评论

相关文章

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

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

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

筛选MultiIndex Pandas DataFrame

更新 Pandas MultiIndex DataFrame

熊猫MultiIndex DataFrame排序

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

Matplotlib:pandas MultiIndex DataFrame 的自定义代码

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

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

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

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

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

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

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

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

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

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

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

Pandas Dataframe Mul在Multiindex上

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

慢熊猫DataFrame MultiIndex重新索引

使用MultiIndex在DataFrame上建立索引

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

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

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

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

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

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