#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
andpandas
, поэтому вам не нужны промежуточные 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
Это работает, если все фреймы данных имеют одинаковую форму (и числовую), как показано в исходном примере.