簡體   English   中英

根據來自另一個數據框的值將數據框拆分為多個數據框

[英]Splitting dataframe into multiple dataframes based on value from another dataframe

我有兩個數據框df1和df2。 df1就像是具有以下值的字典

Ticker          INDUSTRY_SECTOR
TLRA_Equity     Communications
KAMN_Equity     Industrial
B_Equity        Industrial
ARNC_Equity     Industrial
RC_Equity       Consumer, Non-cyclical
DAR_Equity      Consumer, Non-cyclical

df2具有以下值:

  Date   TLRA_Equity  KAMN_Equity  B_Equity  ARNC_Equity RC_Equity DAR_Equity
1/1/2000  10              20        30          40        50          60
2/1/2000  15              25        35          45        55          65
3/1/2000  17              27        37          47        57          67

我想基於對DF2分成3個新的數據幀INDUSTRY_SECTOR在DF1數據幀。

  • 日期,TLRA_Equity列應在“ Communications數據框中
  • 日期,KAMN_Equity,B_Equity,ARNC_Equity列應在Industrial數據框中
  • 日期,RC_Equity,DAR_Equity列應位於Consumer, Non-cyclical數據框中

預期產量:

  • Communications數據框

     Date TLRA_Equity 1/1/2000 10 2/1/2000 15 3/1/2000 17 
  • Industrial數據框

     Date KAMN_Equity B_Equity ARNC_Equity 1/1/2000 20 30 40 2/1/2000 25 35 45 3/1/2000 27 37 47 
  • Consumer, Non-cyclical數據幀

     Date RC_Equity DAR_Equity 1/1/2000 50 60 2/1/2000 55 65 3/1/2000 57 67 

請讓我知道如何高效地進行操作。 我正在嘗試將例如Communications_TLRA_Equity的列名稱連接起來,然后根據列名稱的前半部分拆分數據幀。

碼:

col_names = df2.columns.values.tolist()
d_cols = df2.columns.map(df1.set_index('Ticker')['INDUSTRY_SECTOR'].get)
print(d_cols)
df.columns = [d_cols + "_"  str(col) for col in df.columns]

for sector, df_sector in df.columns.str.split('_').str[0].tolist():
     print(sector)
     print(df_sector)

但這很復雜。 需要更好的解決方案。

您可以使用groupby創建數據框列表,

dfs = [df2.set_index('Date')[ticker].reset_index() for ticker in df1.groupby('INDUSTRY_SECTOR').Ticker.apply(list)]


dfs[0]

    Date    TLRA_Equity
0   1/1/2000    10
1   2/1/2000    15
2   3/1/2000    17


dfs[1]

    Date    RC_Equity   DAR_Equity
0   1/1/2000    50      60
1   2/1/2000    55      65
2   3/1/2000    57      67

dfs[2]


    Date    KAMN_Equity B_Equity    ARNC_Equity
0   1/1/2000    20      30          40
1   2/1/2000    25      35          45
2   3/1/2000    27      37          47

考慮創建幀dict ,密鑰為您的“ INDUSTRY_SECTOR”名稱。

首先創建一個Industry_SECTOR字典:Ticker列

g = df1.groupby('INDUSTRY_SECTOR')['Ticker'].apply(list).to_dict()
print(g)

{'Communications': ['TLRA_Equity'], 'Consumer, Non-cyclical': ['RC_Equity', 'DAR_Equity'], 'Industrial': ['KAMN_Equity', 'B_Equity', 'ARNC_Equity']}

然后創建一個dict理解:

frames = {k:df2.set_index('Date')[v] for k,v in g.items()}

print(frames)

{'Communications':           TLRA_Equity
Date                 
1/1/2000           10
2/1/2000           15
3/1/2000           17,
 'Consumer, Non-cyclical':           RC_Equity  DAR_Equity
Date                           
1/1/2000         50          60
2/1/2000         55          65
3/1/2000         57          67,
 'Industrial':           KAMN_Equity  B_Equity  ARNC_Equity
Date                                        
1/1/2000           20        30           40
2/1/2000           25        35           45
3/1/2000           27        37           47}
NB

正如@Parfait指出的那樣,要包括Date列,您需要將其設置為dict理解中的索引。 如果您不希望“ Date作為索引,請使用:

 frames = {k:df2.set_index('Date')[v].reset_index() for k,v in g.items()} 

暫無
暫無

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

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