Как извлечь значение из серии, созданной в pandas, в Python - PullRequest
0 голосов
/ 24 октября 2018

Речь идет об использовании Python и панд для чтения файла Excel, я не смог найти рабочий пример.

Имя моего файла выглядит примерно так:

2018 Historical Banking Record For Branch 12345.xlsx

Excelимеет содержимое, как показано ниже (извините, я не знаю, как прикрепить файл к этому сообщению):

 2  CD ABC PRODUCT                                                                  
    MA  RI  NH  CT  VT  CA  CR  DE  PHI NJ  ON  FL  WA  DX  HW  AK  MI  IL
01/01/18    1.01    1.61    1.80    1.46    1.69    1.73    1.64    1.64    1.74    1.71    1.68    1.74    1.68    1.87    1.77    2.04    2.05    1.76
01/08/18    2.01    2.61    2.80    2.46    2.69    2.73    2.64    2.64    2.74    2.71    2.68    1.73    1.67    1.84    1.74    2.06    2.04    1.76
01/15/18    3.01    3.61    3.80    3.46    3.69    3.73    3.64    3.64    3.74    3.71    3.68    1.74    1.68    1.86    1.75    2.06    2.04    1.76
01/22/18    4.01    4.61    4.80    4.46    4.69    4.73    4.64    4.64    4.74    4.71    4.68    1.76    1.74    1.73    1.66    1.93    1.84    1.87
01/29/18    5.01    5.61    5.80    5.46    2.01    5.73    1.82    5.64    5.74    5.71    5.68    1.74    1.72    1.71    1.62    1.91    1.82    1.85

enter image description here

Мой код похож наниже:

import pandas as pd
xl = pd.ExcelFile("../data/sample.xlsx", engine='xlrd')

Я могу получить значение ячеек первой строки с помощью

xl.book._sharedstrings[0] ~ xl.book._sharedstrings[18]

Что мне нужно сделать, это как зациклить все строки и получить все значения ячейки?

В конце концов мне нужно сгенерировать новый фрейм данных со структурой, подобной приведенной ниже:

product p_date region p_value c_date eom
CD ABC PRODUCT 01/01/18 MA 1.01 18/10/24 18/10/31

Все поля объясняются как показано ниже:

  1. product: for thisлист, он всегда один и тот же: CD ABC PRODUCT
  2. p_date: должен быть из первого столбца:

    01/01/18
    01/08/18
    01/15/18
    01/22/18
    01/29/18
    
  3. регион:

    MA
    RI
    NH
    CT
    ....
    
  4. p_value: десятичное число под каждым регионом, например, 1.01

  5. c_date: сегодняшняя дата, 18/10/24
  6. eom: последнийdза этот месяц 18/10/31

на этом листе 18 регионов, что означает, что для нового кадра данных будет создано 18 записей.

Я могу получить всеячейки, за исключением первого столбца для p_date:

01/01/18
01/08/18
01/15/18
01/22/18
01/29/18

Кажется, он из "Series", как показано ниже, но я не знаю, как извлечь значение из него.

enter image description here

Я могу использовать list (df ["MA"]) для преобразования Series df ["MA"] в список, но я все еще не могу получить p_date.

В идеале мне нужно зациклить каждую строку при генерации / добавлении кадра данных

cur_row=[wampproduct, wamp_date, wampregion, rsp, wamp, date_pull, eom]
df_row = pd.DataFrame(columns=cols, data=cur_row)
df = df.append(df_row, ignore_index=True)

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Используя код @ alexdor и мой собственный код, я теперь могу сгенерировать необходимый результат, как показано ниже:

,product,p_date,region,p_value,c_date,eom
0,CD Short-Term WAMP,2010-01-01,MA,0.8763918845487475,201812,2018-12-31
1,CD Short-Term WAMP,2010-01-08,MA,0.8600652449166932,201812,2018-12-31
2,CD Short-Term WAMP,2010-01-15,MA,0.8593079486202981,201812,2018-12-31

Чтобы удалить порядковый номер, который позже вызовет проблему, установите index = False, как показано ниже:

df_csv.to_csv(physical_file, index=False)
0 голосов
/ 25 октября 2018

Этот тип операции называется расплавлением.Это, по сути, обратное повороту кадра данных.Кроме того, как указал Мэтью в комментарии, использовать read_excel немного проще, поскольку он напрямую возвращает фрейм данных.Следующий блок кода запускает расплав.

fname = ../data/sample.xlsx''
date_pull = pd.to_datetime('2018-10-18')
eom =  pd.to_datetime('2018-10-31')

# get product name out of excel file
product = pd.read_excel(fname, nrows=1, header=None, usecols=[1])
product = product.loc[0, 0]
product

# load data from excel fail
df = pd.read_excel(fname, header=1)

# rename index to p_date and make a column
df.index.rename('p_date', inplace=True)
df = df.reset_index()

# add product to df
df['product'] = product

# melt 
df = pd.melt(df, id_vars=['product', 'p_date'], var_name='region', value_name='p_value')

# add c_date and eom to data frame
df['c_date'] = date_pull
df['eom'] = eom
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...