Среднее количество текстовых файлов с пандами данных - PullRequest
0 голосов
/ 27 января 2019

У меня куча текстовых файлов с точно такой же структурой. Каждый текстовый файл содержит m строк и n столбцов данных. Я хочу взять среднее значение по каждой записи и сообщить окончательный DF.

txt1

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

txt2

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

txt3

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

Конечный фрейм данных

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

Каким был бы эффективный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Это может быть очень быстро, если вы используете numpy для чтения:

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)

Затем просто создайте фрейм данных с массивом

0 голосов
/ 27 января 2019

Приведенный ниже код позволяет вам перебирать папку и добавлять все ваши текстовые файлы в один фрейм данных.

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)

Как только у вас есть добавленные данные, выполните:

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
0 голосов
/ 27 января 2019

Попробуйте

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

Если у вас есть произвольное количество фреймов данных, вы можете сделать

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...