Как получить средства столбцов каждой X строк из нескольких CSV-файлов - PullRequest
0 голосов
/ 28 апреля 2020

Я уже несколько дней обдумываю эту проблему:

  • У меня есть несколько фреймов данных в файлах csv, которые имеют одинаковый формат (имена столбцов, имена строк), и я Вы хотите вычислить среднее значение каждой строки каждого файла, а затем сохранить его в выходной CSV-файл. И это работает так:
import glob

import csv

with open('result.csv', 'w', newline='') as f_output:

    csv_output = csv.writer(f_output)

    for filename in glob.glob('F*.csv'):
        print (filename)
        with open (filename, newline='') as f_input:

            csv_input = csv.reader(f_input)
            header = next(csv_input)
            averages = [] #making a list for averages 

            for col in zip(*csv_input):
                averages.append(sum(float(x) for (x) in col) / len(col))


        csv_output.writerow([filename] + averages)
  • Но мне действительно нужно среднее значение каждого столбца каждого кадра данных каждые 18 строк (потому что каждая строка = 1 минута), исключая заголовок (потому что это строка). Поэтому я пытался выбрать только первые 18 строк с чем-то вроде этого в для l oop
df = pd.read_csv(df,skiprows=0, nrows = 18) #to get only first 18 minutes'

Но это 1) не работает (я думаю, потому что это не применимо для читателя) 2) не идеально, потому что я на самом деле просто хочу разделить все dfs на 18 строк, а затем вычислить среднее значение для каждой строки.

Любой намек был бы очень полезен, спасибо!

update

"Возможно, вы можете показать нам небольшой примерный фрейм данных (с 4-5 столбцами и строками) и показать нам, какой вывод вы хотите (делая вид, что вы этого хотите) каждые 2 строки вместо каждых 18). "

Это мой пример df для каждого файла

      col1       col2       col3     col4        col5        col6
0   1.228516    61.228516   1.0     418.808284  957.419867  1025.554374
1   61.228516   121.228516  1.0     207.864712  694.581742  814.149004  
2   121.228516  181.228516  1.0     140.516367  370.653176  809.100268  
3   181.228516  241.228516  1.0     140.274964  448.755593  885.196647  
4   241.228516  301.228516  1.0     117.079110  312.173256  1907.873698

Я хочу вычислить среднее значение первых двух строк (0,1) для каждый столбец, скажем, здесь forl col6. Таким образом, мой вывод будет (1025.554374 + 814.149004) / 2 # определение арифметического c среднее.

Мне просто нужно это во всех моих CSV-файлах, но для каждых 18 строк

Надеюсь, теперь все стало понятнее, спасибо!

1 Ответ

0 голосов
/ 28 апреля 2020

Вместо того, чтобы использовать для l oop, я бы рекомендовал загрузить весь фрейм данных и использовать groupby и разделение по полу :

df.groupby(df.index // 18).mean()

Вам не нужно a для l oop, чтобы сделать это для всех ваших файлов:

def group_mean(df):
    return df.groupby(df.index // 18).mean()
df = pd.concat([group_mean(pd.read_csv(fname)) for fname in glob.glob('F*.csv')])
df.to_csv('result.csv')

Если вы хотите сделать это в для l oop по какой-то причине:

dfs = []
for fname in fname in glob.glob('F*.csv'):
    df = pd.read_csv(fname)
    dfs.append(df.groupby(df.index // 18).mean())
pd.concat(dfs).to_csv('result.csv')

Если вы действительно хотите загружать фрейм данных по 18 строк за раз (что было бы целесообразно, если бы ваши данные были действительно массивными), вы можете использовать оператор chunksize:

reader = pd.read_csv('result.csv', chunksize=18)
for chunk in reader:
    print(chunk.mean())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...