这是关于使用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
我的代码如下:
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
所有字段的解释如下:
p_date:应该位于第一列:
01/01/18
01/08/18
01/15/18
01/22/18
01/29/18
区域:
MA
RI
NH
CT
....
p_value:每个区域下的小数,例如1.01
此工作表中有18个区域,这意味着将为新数据框创建18条记录。
我能够获得除p_date的第一列以外的所有单元格:
01/01/18
01/08/18
01/15/18
01/22/18
01/29/18
它似乎来自“系列”,如下所示,但我不知道如何从中获取价值。
我可以使用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)
非常感谢您。
答案 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}}