我有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
中做到这一点?
答案 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工作表。
希望它能解决您的问题。 :)