Python 基于另一个数据帧的值将数据帧拆分为多个数据帧

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

我有两个数据帧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
我想基于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()}