如何从Python中的熊猫数据框中创建的系列中检索值

时间:2018-10-24 20:16:07

标签: python excel pandas dataframe

这是关于使用python和pandas读取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. 产品:此表始终相同: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:今天的日期,24/10/18
  6. eom:本月的最后日期31/10/31

此工作表中有18个区域,这意味着将为新数据框创建18条记录。

我能够获得除p_date的第一列以外的所有单元格:

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

它似乎来自“系列”,如下所示,但我不知道如何从中获取价值。

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 :(得分:0)

这种操作称为熔化。从本质上讲,这与旋转数据框相反。而且,正如Mathew在评论中指出的那样,使用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

答案 1 :(得分:0)

使用@alexdor的代码加上我自己的代码,我现在能够生成所需的结果,如下所示:

df_csv.to_csv(physical_file, index=False)

要删除以后会引起问题的序列号,请设置index = False,如下所示:

{{1}}