Использование Pandas для усреднения данных по листам Excel с соответствующими данными столбцов - PullRequest
0 голосов
/ 22 марта 2019

Data Snippet

См. Фрагмент данных.У меня есть похожие данные на нескольких листах в Excel, причем каждый лист представляет собой отдельный год.Для каждого месяца, дня и времени (12 и 00) я хотел бы взять среднее значение столбца K по всем листам.Однако для каждого листа не существует одинакового числа строк данных.Я хотел бы взять среднее значение K по всем листам, но только если данные в столбцах A, B, E, G все совпадают по всем листам.Таким образом, из примера данных я бы получил среднее значение K2 для всех листов, где в каждом листе месяц = ​​1, дата = 1, время = am и mb = 100.

1 Ответ

0 голосов
/ 22 марта 2019

Не имея ваших данных, я сделал два примера DataFrames

Прежде всего вам необходимо импортировать данные из Excel в pandas с помощью:

df1 = pd.read_excel('name_file.xlsx', sheet_name='year2018')

И делайте это каждый год.

После этого вы можете использовать мой пример, чтобы получить ожидаемый результат:

# Example dataframe 1
print(df1)

   Month  Date  Year Time   mb  dir
0      1     1  2018   AM  100  265
1      1     1  2018   AM  150  265
2      1     1  2018   AM  200  270
3      1     1  2018   AM  250  270
4      1     1  2018   PM  100  265
5      1     1  2018   PM  150  265
6      1     1  2018   PM  200  265
7      1     1  2018   PM  250  265

#Example dataframe2
print(df2)

   Month  Date  Year Time   mb  dir
0      1     1  2019   AM  100  275
1      1     1  2019   AM  150  275
2      1     1  2019   AM  200  280
3      1     1  2019   AM  250  280
4      1     1  2019   PM  100  275
5      1     1  2019   PM  150  275
6      1     1  2019   PM  200  275
7      1     1  2019   PM  250  280

Мы можем использовать pandas.concat, чтобы добавить вместе кадры данных (в вашем случае их может быть больше двух).

df_all = pd.concat([df1, df2], ignore_index=True)
print(df_all)

    Month  Date  Year Time   mb  dir
0       1     1  2018   AM  100  265
1       1     1  2018   AM  150  265
2       1     1  2018   AM  200  270
3       1     1  2018   AM  250  270
4       1     1  2018   PM  100  265
5       1     1  2018   PM  150  265
6       1     1  2018   PM  200  265
7       1     1  2018   PM  250  265
8       1     1  2019   AM  100  275
9       1     1  2019   AM  150  275
10      1     1  2019   AM  200  280
11      1     1  2019   AM  250  280
12      1     1  2019   PM  100  275
13      1     1  2019   PM  150  275
14      1     1  2019   PM  200  275
15      1     1  2019   PM  250  280

Теперь мы можем использовать pandas.Groupby.Series.mean, чтобы получить ожидаемый результат:

print(df_all.groupby(['Month', 'Date', 'Time', 'mb']).dir.mean().reset_index())

   Month  Date Time   mb    dir
0      1     1   AM  100  270.0
1      1     1   AM  150  270.0
2      1     1   AM  200  275.0
3      1     1   AM  250  275.0
4      1     1   PM  100  270.0
5      1     1   PM  150  270.0
6      1     1   PM  200  270.0
7      1     1   PM  250  272.5
...