python - 用户输入 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
?
解决方案
标题可以向下多少行?让我们假设它在前 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)