【问题标题】:Splitting dataframe into multiple dataframes based on value from another dataframe根据来自另一个数据帧的值将数据帧拆分为多个数据帧
【发布时间】:2019-08-20 13:49:59
【问题描述】:

我有两个数据框 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_SECTOR 将 df2 拆分为 3 个新数据帧。

  • 日期,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)

但这很复杂。需要更好的解决方案。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    考虑创建一个dict 帧,键是您的“INDUSTRY_SECTOR”名称。

    首先创建一个 INDUSTRY_SECTOR 的字典:Ticker columns

    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}
    
    注:

    正如@Parfait 指出的那样,要包含Date 列,您需要将其设置为字典理解中的索引。如果您不想将Date 作为索引,请改用:

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

    【讨论】:

    • 太棒了!工作正常:)
    • @ArvinthKumar ...当您获得带有命名对象的数据框时,我会认为这是公认的答案:frames['Communications']frames['Industrial'] 等。
    • @Parfait .. 两个答案都很好。在接受时,我没有意识到输出的差异。
    【解决方案2】:

    您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多