Разбить один фрейм данных на несколько вложенных фреймов данных на основе общих столбцов в Pandas

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

Предполагая, что фрейм данных выглядит df следующим образом:

             ISIN  Coupon  Issue Date Maturity Date  Jan 18th  Jan 19th  
0   CA135087A610  0.0150   7/30/2012      6/1/2023    103.13    103.14   
1   CA135087F254  0.0075  10/19/2015      3/1/2021    100.08    100.08   
2   CA135087F585  0.0075   4/11/2016      9/1/2021    100.40    100.40   
3   CA135087G328  0.0050  10/11/2016      3/1/2022    100.44    100.43   
4   CA135087H490  0.0175   10/6/2017      3/1/2023    103.29    130.29   
5   CA135087ZU15  0.0275    8/2/2011      6/1/2022    103.61    103.60   
6   CA135087J546  0.0225   10/5/2018      3/1/2024    106.21    106.21   
7   CA135087J967  0.0150    4/5/2019      9/1/2024    104.27    104.28   
8   CA135087K528  0.0125  10/11/2019      3/1/2025    103.60    103.60   
9   CA135087K940  0.0050    4/3/2020      9/1/2025    100.33    100.32   
10  CA135087L518  0.0025   10/9/2020      3/1/2026     98.78     98.77   

    Jan 20th  
0     103.10  
1     100.08  
2     100.39  
3     100.41  
4     103.25  
5     103.57  
6     106.17  
7     104.25  
8     103.59  
9     100.30  
10     98.76  
 

Мне нужно разделить его на 3 вложенных фрейма данных на основе общих столбцов ISIN , Coupon , Issue Date , Maturity Date .

 common_columns = ['ISIN', 'Coupon', 'Issue Date', 'Maturity Date']
df1.columns = common_columns   'Jan 18th'
df2.columns = common_columns   'Jan 19th'
df3.columns = common_columns   'Jan 20th'
 

Затем сохраните их в файле Excel с Jan 18th Jan 19th именем листа и Jan 20th . Пожалуйста, обратите внимание, что в реальных данных есть другие столбцы даты Jan 21th , и т.д. Jan 22th

Чтобы сохранить фреймы данных:

 writer = pd.ExcelWriter('data.xlsx')
df1.to_excel(writer, 'Jan 18th')
df2.to_excel(writer, 'Jan 19th')
df3.to_excel(writer, 'Jan 20th')
writer.save()
 

Как я мог это сделать в Python? Спасибо.

Обновить:

Для ISIN замены первого листа на 2021-01-18 , 18 января на Close Price , ISIN замена второго листа на 2021-01-19 , 19 января на Close Price , ISIN замена третьего листа на 2021-01-20 , 20 января на Close Price .

Ответ №1:

Давайте используем index.difference для получения столбцов, похожих на дату, путем удаления comm_columns из фрейма данных, затем для каждого столбца, похожего на дату, используйте DataFrame.to_excel вместе с pd.ExcelWriter для создания листов:

 comm_cols = ['ISIN', 'Coupon', 'Issue Date', 'Maturity Date']
date_cols = df.columns.difference(comm_cols)

with pd.ExcelWriter('data.xlsx') as writer:
    for col in date_cols:
        sub_df = df[comm_cols   [col]]
        sub_df.to_excel(writer, sheet_name=col)
        
    writer.save()
 

ОБНОВЛЕНИЕ: для rename столбца ISIN при сохранении листа используйте:

 comm_cols = ['ISIN', 'Coupon', 'Issue Date', 'Maturity Date']
isin_cols = ['2021-01-18', '2021-02-18', '2021-02-19']
date_cols = df.columns.difference(comm_cols)

with pd.ExcelWriter('data.xlsx') as writer:
    for col, isin_col in zip(date_cols, isin_cols):
        sub_df = df[comm_cols   [col]].rename(columns={'ISIN': isin_col})
        sub_df.to_excel(writer, sheet_name=col)
        
    writer.save()
 

Комментарии:

1. Спасибо, возможно ли изменить столбцы каждого вложенного фрейма данных с '2021-01-18', 'Coupon', 'Issue Date', 'Maturity Date', 'Close Price' '2021-01-19', 'Coupon', 'Issue Date', 'Maturity Date', 'Close Price' df2 помощью for df1, for и т.д. перед сохранением в Excel?

2. Это означает, что мне нужно переименовать ISIN с 2021-01-18, etc помощью и Jan 18th переименовать с помощью Close Price for df1 .

3. Отлично, не могли бы вы добавить код для этого?

4. @ahbon Можете ли вы предоставить список новых имен, которые должны быть отображены в столбце ISIN?

5. @ahbon обновил ответ в соответствии с вашими требованиями.