Как найти среднее значение для каждой ячейки в нескольких CSV-файлах

#python #pandas #numpy #dataframe #csv

#python #панды #numpy #фрейм данных #csv

Вопрос:

У меня есть несколько файлов Excel с данными в них в формате, подобном этому

 csv1             csv1
  a b c           a b c
x 1 2 3         x 3 2 1
y 4 5 6         y 6 5 4
  

Всего 3 csv, и мне нужно создать новый csv со средним значением для каждой ячейки.
Так csv3 было бы следующим образом

   a       b        c
x (3 1)/2) (2 2)/2  (3 1)/2
y (6 4)/2  etc.
  

Пока у меня есть импортированные файлы, но я не уверен, как поступить.

 import pandas as pd

def Averager(fileA,fileB,fileC):
    csvA=pd.read_csv(fileA)
    csvB=pd.read_csv(fileB)
    csvC=pd.read_csv(fileC)
    g=pd.concat([csvA, csvB, csvC]).groupby(level=0).mean()
    print(g)                                                   
print(Averager('a.csv','b.csv','c.csv'))
  

Комментарии:

1. Вы упоминаете, что у вас есть книга Excel, затем вы упоминаете, что у вас есть csv — что это? К вашему сведению, вы можете импортировать книгу Excel с помощью openpyxl and pandas , поэтому вам не нужны промежуточные csv.

2. Как насчет df1.add(df2)/2 . Или, в вашем случае: (csvA csvB csvC)/3 — предоставление всех фреймов данных одинаковой формы, как в показанном примере.

3. Спасибо @S3DEV, это сработало!

Ответ №1:

Поскольку вы отметили numpy , я предполагаю, что решение numpy будет работать.

 import numpy as np
csv1 = np.genfromtxt('my_file1.csv', delimiter=',')
csv2 = np.genfromtxt('my_file2.csv', delimiter=',')
np.savetxt("foo.csv", (csv1 csv2)/2, delimiter=",")    
  

Комментарии:

1. Спасибо, Кунг-фу Панда!

Ответ №2:

Вы довольно близки, вот решение, которое должно сработать. Я использую pathlib для создания имен файлов, он довольно прост в использовании.

 import pandas as pd
from pathlib import Path

p = Path(r"path/to/file")

data = {}
for i in range(1,4):
    f = p / f"csv{i}.csv"
    data[i]=pd.read_csv(f)

df = pd.concat(data)
avg=df.groupby(level=1).mean()

print(df)
print(avg)
  

Комментарии:

1. Рекомендуем использовать os.path.join форматирование и строку поверх этого p / ("csv" str(i) ".csv") , так как это очень не по-питоновски.

2. @S3DEV Нет, это старый способ до pathlib . Хотя я не согласен с их выбором последовательности строк: p / f"csv{i}.csv"

3. @MaximilianBurszley — Точка взята. В этом случае pathlib синтаксис ужасен. В моей голове / есть оператор деления. Ick.

4. @S3DEV Это выглядит лучше, когда у вас есть несколько фрагментов пути: p / "root" / "files" / "etc"

5. @S3DEV — мне потребовалось некоторое время, чтобы привыкнуть к этому, но теперь я использую только pathlib, мне действительно начала нравиться идея использования «/» для объединения путей.

Ответ №3:

Один очень простой подход, после считывания данных CSV в DataFrames:

  df1.add(df2)/2
  

Или, в данном конкретном случае:

 (csvA csvB csvC)/3
  

Это работает, если все фреймы данных имеют одинаковую форму (и числовую), как показано в исходном примере.