首页 > 解决方案 > 用户输入 pd.read_excel 给出“ValueError:无效的文件路径或缓冲区对象类型” - 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

标签: pythonpython-3.xpandas

解决方案


标题可以向下多少行?让我们假设它在前 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)

推荐阅读