J'ai un tas de fichiers txt avec exactement la même structure. Chaque fichier txt contient m lignes et n colonnes de données. Je veux prendre une moyenne sur chaque entrée et rapporter un df final.
txt1
Hour | X1 | X2 | X3 | X4 0 | (15+10+11)/3 | .. | 37 1 | (26+20+21)/3 | .. | 45 2 | (18+13+18)/3 | .. | 25 3 | (65+65+65)/3 | .. | 14
txt2
Hour | X1 | X2 | X3 | X4 0 | 11 | 13 | 25 | 37 1 | 21 | 52 | 21 | 45 2 | 18 | 41 | 45 | 25 3 | 65 | 31 | 98 | 14
txt3
Hour | X1 | X2 | X3 | X4 0 | 10 | 13 | 45 | 37 1 | 20 | 53 | 31 | 45 2 | 13 | 43 | 45 | 25 3 | 65 | 32 | 38 | 14
Trame de données finale
Hour | X1 | X2 | X3 | X4 0 | 15 | 13 | 25 | 37 1 | 26 | 52 | 21 | 45 2 | 18 | 45 | 45 | 25 3 | 65 | 38 | 98 | 14
Quelle serait une manière efficace de le faire?
3 Réponses :
Essayez
import pandas as pd
import os
file_path = 'path/to/files/'
file_names = os.listdir(file_path)
dataframes = []
# Import DataFrames.
for file_name in file_names:
dataframes.append(pd.read_csv(file_path + file_name, sep='|', index_col=0))
df_avg = sum(dataframes) / len(dataframes)
Si vous avez un nombre arbitraire de DataFrames, vous pouvez faire
df1 = pd.read_csv('path/to/file_1.txt', sep='|', index_col=0)
df2 = pd.read_csv('path/to/file_2.txt', sep='|', index_col=0)
df3 = pd.read_csv('path/to/file_3.txt', sep='|', index_col=0)
df_avg = (df1 + df2 + df3) / 3
Et si j'ai 1000 fichiers txt?
Cela pourrait être très plus rapide si vous utilisez numpy pour lire:
import numpy as np
import re
import pandas as pd
fnames = ['data1.txt', 'data2.txt', 'data3.txt']
mean = 0
for fname in fnames:
mean += np.loadtxt(fname, delimiter='|', skiprows=1)[:, 1:]
mean /= len(fnames)
print(mean)
# or if you want access to all of them:
frames = []
for fname in fnames:
frames.append(np.loadtxt(fname, delimiter='|', skiprows=1)[:, 1:])
frames = np.stack(frames)
mean = np.mean(frames, axis=0)
print(frames)
print(mean)
df = pd.read_csv('data1.txt', sep='|', index_col=0)
df.loc[:, df.columns[:]] = mean
print(df)
Ensuite, créez simplement un dataframe avec le tableau
Le code ci-dessous vous permet d'itérer dans un dossier et d'ajouter tous vos fichiers texte dans une seule trame de données.
df.groupby('Hour')[df.columns[1:]].mean().reset_index()
Hour X1 X2 X3 X4
0 0 12.00 13.00 31.67 37.00
1 1 22.33 52.33 24.33 45.00
2 2 16.33 43.00 45.00 25.00
3 3 65.00 33.67 78.00 14.00
Une fois les données ajoutées, procédez comme suit:
import os
import glob
import pandas as pd
os.chdir('C:\\path_to_folder_for_text_files\\')
Filelist = glob.glob('*.txt')
appended_data = []
for file in FileList:
df = pd.read_csv(file,sep='|')
#df = any other operations in each file if required
appended_data.append(df)
appended_data = pd.concat(appended_data)
df = pd.DataFrame(appended_data)