[英]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數據幀。
Communications
數據框中 Industrial
數據框中 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.