簡體   English   中英

Pandas:如何將 MultiIndex DataFrame 與單個索引 DataFrame 連接起來,以及自定義排序

[英]Pandas: how to concatenate a MultiIndex DataFrame with a single index DataFrame, and custom ordering

我有一個 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 )進行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'])

編輯:

  • df_single沒有“場景”值,這可能會令人困惑。 只要“產品”的比賽中,相同的行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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM