Разделение фрейма данных на несколько фреймов на основе значения из другого фрейма данных - PullRequest
2 голосов
/ 29 марта 2019

У меня есть два кадра данных 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)

Но это сложно. Нужно лучшее решение.

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Рассмотрите возможность создания dict фреймов, ключом которого будет ваше имя 'INDUSTRY_SECTOR`.

Сначала создайте команду INDUSTRY_SECTOR: тикеры столбцов

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. Если вы не хотите Date в качестве индекса, вместо этого используйте:

frames = {k:df2.set_index('Date')[v].reset_index() for k,v in g.items()}
2 голосов
/ 29 марта 2019

Вы можете создать список фреймов данных, используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...