2017-06-14 50 views
1

我有一个Excel文件foo.xlsx用约40张sh1sh2等。每个片具有格式:Python的环路通过Excel工作表,放入一个DF

area  cnt name\nparty1 name\nparty2 
blah  9   5    5 
word  3   7    5 

在每个片材我要重命名的格式为name\nparty的变量只能将party作为标签。示例输出:

area  cnt party1 party2  sheet 
bacon  9   5   5  sh1 
spam  3   7   5  sh1 
eggs  2   18  4  sh2 

我读在文件中:

book = pd.ExcelFile(path) 

然后想知道如果我需要做的:

for f in filelist: 
    df = pd.ExcelFile.parse(book,sheetname=??) 
    'more operations here' 
    # only change column names 2 and 3 
    i, col in enumerate(df): 
    if i>=2 and i<=3: 
     new_col_name = col.split("\n")[-1] 
     df[new_col_name] = 

或类似的东西?

回答

2

如果您设置关键字参数sheetname=None,则read_excel方法pandas可让您一次读取所有表单。这将返回一个字典 - 键是表名,值是作为数据框的表。

利用这一点,我们可以通过字典简单循环和:

  1. 添加一个额外的列包含相关SHEETNAME
  2. 使用rename方法重命名我们列dataframes - 通过使用lambda,我们只需在每次有新行时拆分每个列名获取列表的最终条目。如果没有新行,列名称不变。
  3. 追加到“全表”

一旦做到这一点,我们将重置指数和所有应该很好。注意:如果您在一张纸上显示的是当事人而不是其他人,则此功能仍然有效,但会填写每张表中缺失的任何列,其中包含NaN

import pandas as pd 

sheets_dict = pd.read_excel('Book1.xlsx', sheetname=None) 

full_table = pd.DataFrame() 
for name, sheet in sheets_dict.items(): 
    sheet['sheet'] = name 
    sheet = sheet.rename(columns=lambda x: x.split('\n')[-1]) 
    full_table = full_table.append(sheet) 

full_table.reset_index(inplace=True, drop=True) 

print full_table 

打印:

area cnt party1 party2 sheet 
0 bacon 9  5  5 Sheet1 
1 spam 3  7  5 Sheet1 
2 eggs 2  18  4 Sheet2 
+0

对不起,我不清楚。 'name \ nparty'中的名字改变了每张表格。这是选举结果,我不希望候选人只说出他们的派对。是否有某种通配符或字符串拆分,只保留'\ n'之后的所有内容? –

+2

我认为.split('\ n')[ - 1]只保留\ n后面的部分字符串。例如, “Frank Underwood \ n虚构民主党人”.split('\ n')[ - 1] 返回'Fictional Democrat' – DalekSec

+1

@DalekSec正在编辑它!肯定的正确方法。 – asongtoruin

相关问题