我有一个 MultiIndex pandas DataFramedf_multi
like:
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'])
和单个索引 DataFramedf_single
like:
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
begin.
我还希望生成的 DataFrame 首先由 ['Product','Scenario'] 进行多重索引(就像df_multi
),然后按“时间”的升序值排序行。换句话说,期望的结果是:
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'])
EDIT:
-
df_single
没有“场景”值,这可能会令人困惑。只要“Product”匹配,相同的行df_single
将被附加到中的每个场景df_multi
,并且他们只是免费“继承”场景值。
- 我正在使用的实际数据框架相当大(每个产品几千个“产品”,几千个“场景”,每个场景几百个“时间”步骤,加上我在示例中没有写的额外列),所以我需要以完全自动化(并且希望快速)的方式来完成此操作。
我尝试用所有的来实现这个join
, concat
and merge
,而我没有成功。实现预期结果的最佳方法是什么?