用户输入pd.read_excel给出“ ValueError:无效的文件路径或缓冲区对象类型”-熊猫

时间:2018-07-10 19:12:27

标签: python python-3.x pandas

我有list个Excel文件,它们被读入pandas个数据帧中。但是,某些文件(数据帧)在不同的行中具有不同的头。因此,我希望有一个用户输入,这将帮助我为每个DataFrame设置数据帧头。

让我们说我的第一个(Excel文件)数据框看起来像这样,

0   245                 867               
1   Reddit              Facebook          
2   ColumnNeeded        ColumnNeeded      
3   RedditInsight       FacbookInsights   
4   RedditText          FacbookText             

现在,我想让用户查看一下,然后输入第2行(索引1)作为数字,然后我的输出数据帧将像这样,

    Reddit              Facebook          
0   ColumnNeeded        ColumnNeeded      
1   RedditInsight       FacbookInsights   
2   RedditText          FacbookText

这样,我可以为每个数据框创建标题。

这就是我的生活

excel_file_dfs = []

for file in glob.glob(r'path\*.xlsx'):
    df = pd.read_excel(file)

## Not sure how to show the DataFrame here so, user can select the row to be the header

    ask_user = input("What raw do you want to make it header? ")
    header_number = ask_user
    df = pd.read_excel(file, header=[header_number])
    excel_file_dfs.append(df)

我收到此错误:

  

ValueError:无效的文件路径或缓冲区对象类型:

df = pd.read_excel(each_file, header=[ask_user])行开始。

我知道我正在读pd.read_excel()两次,这可能会导致大量的内存和处理。

无论如何,我希望用户看到每个DataFrame,然后输入行号以选择标题。如何在pandas中做到这一点?

2 个答案:

答案 0 :(得分:1)

标题可以向下几行?让我们假设它在前5个以内: 这种方法有意义吗?

import pandas as pd

data = '''\
245                 867               
Reddit              Facebook          
ColumnNeeded        ColumnNeeded      
RedditInsight       FacbookInsights   
RedditText          FacbookText
'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+', header=None)

print(df.head(5))

inp = input('Which row is header?')
n = int(inp)

df.columns = df.loc[n].values
df = df.loc[n+1:]
print(df)

或使用循环定义函数:

def change_header(df, i=5):
    n = 0
    while True:
        print(df.loc[n:n+i])
        inp = input('Which row is header? (number or (n)ext or (r)estart)')
        if inp.isdigit():
            n = int(inp)
            if n < len(df):
                break
            else:
                n = 0
                print('error')
                continue
        elif inp.lower().startswith('r'):
            n = 0
            continue
        elif inp.lower().startswith('n'):
            if (n+i) < len(df):
                n += i
            continue
        else:
            print('Try something else')

    df.columns = df.loc[n].values
    df = df.loc[n+1:]
    return df

df = change_header(df, 5)

答案 1 :(得分:0)

您可以使用os库并按以下方式调用文件:

import os
import pandas as pd
excel_file_dfs = []
directory = 'C:/your_directory_here'
for filename in os.listdir(directory):
    if filename.endswith('.xlsx'):
        header_number = print('Enter row number you want to make header: ')
        df = pd.read_excel(filename, header=int(header_number))
        excel_file_dfs.append(df)
final_df = pd.concat(excel_file_dfs)
final_df

这样一来,您首先可以要求标题,并获取os并调用目录并获取所有excel工作表。 希望它能解决您的问题。 :)