Python 基于另一个数据帧的值将数据帧拆分为多个数据帧
我有两个数据帧df1和df2。df1就像一个具有以下值的字典Python 基于另一个数据帧的值将数据帧拆分为多个数据帧,python,pandas,dataframe,Python,Pandas,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-cyclic
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
我想基于df1数据帧中的INDUSTRY\u SECTOR
,将df2拆分为3个新的数据帧
- 日期,TLRA_Equity列应位于
数据框中通信
- 日期、KAMN_股权、B_股权、ARNC_股权列应位于
数据框中工业
- 日期、RC_权益、DAR_权益列应位于消费者、非周期数据框中
数据帧通信
Date TLRA_Equity 1/1/2000 10 2/1/2000 15 3/1/2000 17
数据帧工业
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
数据帧消费者,非周期性
Date RC_Equity DAR_Equity 1/1/2000 50 60 2/1/2000 55 65 3/1/2000 57 67
Communications\u TLRA\u Equity
,然后基于列名的前半部分拆分数据帧
代码:
但这很复杂。需要更好的解决方案 您可以使用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
,关键是你的“行业”名称
首先创建一个行业目录:股票代码列
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']}
然后创建一个听写理解:
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}
请注意
正如@Parfait所指出的,要包含Date
列,需要将其设置为dict理解中的索引。如果不想将日期作为索引,请使用:
frames = {k:df2.set_index('Date')[v].reset_index() for k,v in g.items()}
伟大的工作正常:)@ArvinthKumar。。。我原以为这是一个公认的答案,因为你得到的是带有命名对象的数据帧:
frames['Communications']
,frames['Industrial']
,等等@Parfait。。两个答案都很好。在接受时,我没有意识到输出的差异。
frames = {k:df2.set_index('Date')[v].reset_index() for k,v in g.items()}