我有一个 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] 删除。
我来说两句