Прочитайте все файлы excel в папке и разделите имя каждого файла, добавьте разделенное имя в фрейм данных

#python #excel #pandas

Вопрос:

Все файлы имеют соглашение об именах, например NPS_Platform_FirstLabel_Session_Language_Version.xlsx Я хочу иметь дополнительные столбцы, такие как Платформа, Первая метка, Сессия, Язык, версия, это будут имена столбцов и значения, определяемые именами файлов. Я закодировал следующее, это работает, но значение добавленных столбцов только что получено из последнего файла. Например, предположим, что последнее имя файла NPS_MEM_GAIT_Science_EN_10.xlsx. Поэтому все добавленные значения столбцов-это MEM, GAIT_Science и т. Д. Не соответствующие имена файлов.

 import glob
import os
import pandas as pd

path = "C:/Users/User/blabla"
all_files = glob.glob(os.path.join(path, "*.xlsx")) #make list of paths

df = pd.DataFrame()

for f in all_files:
    data = pd.read_excel(f)
    df = df.append(data)
    file_name = os.path.splitext(os.path.basename(f))[0]
    nameList = []
    nameList = file_name.rsplit('_')  
    df['Platform'] = nameList[1]
    df['First label']= nameList[2]
    df['Session'] = nameList[3]
    df['Language'] = nameList[4]
    df['Version'] = nameList[5]
df
 

Я начал со списка имен[1], так как я не хочу NPS.
Есть какие-либо предложения или отзывы?

Ответ №1:

Я нашел решение, я оставляю его здесь, так как просмотров больше, чем я ожидал.

 import glob
import os
import pandas as pd


path = "C:/Users/User/....."
all_files = glob.glob(os.path.join(path, "*.xlsx")) #make list of paths

df_files= [pd.read_excel(filename) for filename in all_files]

for dataframe, filename in zip(df_files, all_files):
    filename =os.path.splitext(os.path.basename(filename))[0]
    filename = filename.rsplit('_') 
    dataframe['Platform'] = filename[1]
    dataframe['First label']= filename[2]
    dataframe['Session'] = filename[3]
    dataframe['Language'] = filename[4]
    dataframe['Version'] = filename[5]
df= pd.concat(files_df, ignore_index=True)
 

Я думаю, причина в том, что я просто перебирал файлы, а не фрейм данных, который я пытался создать. С помощью этого я могу одновременно перебирать фрейм данных и имена файлов. Я нашел это решение на https://jonathansoma.com/lede/foundations-2017/classes/working-with-many-files/class/
Но все же, если вы можете дать четкий ответ о том, почему первый код работает не так, как я хочу, было бы здорово