#python #pandas #pivot #pandas-groupby #mean
#python #панды #сводная #pandas-groupby #среднее
Вопрос:
При вычислении a mean
двумя разными способами (в фрейме данных и в том же сводном фрейме данных) Я ожидаю, что результаты будут идентичными. Однако, похоже, они отличаются. Я что-то упускаю?
Вот набор данных:
import pandas as pd # pandas version is 1.3.4
df = pd.read_csv(
'https://data.rivm.nl/covid-19/COVID-19_aantallen_gemeente_per_dag.csv',
usecols = ['Date_of_publication', 'Municipality_code', 'Municipality_name', 'Province', 'Total_reported', 'Hospital_admission', 'Deceased'],
parse_dates = ['Date_of_publication'],
index_col = ['Date_of_publication'],
sep = ';'
).dropna()
df.tail()
Я хотел бы вычислить среднее значение для каждого Date_of_publication
столбца Total_reported
.
Способ 1:
df.Total_reported.groupby(df.index).mean()
Способ 2:
df_pivot = pd.pivot_table(
df.reset_index(),
values='Total_reported',
index='Date_of_publication',
columns='Municipality_name'
)
df_pivot.mean(axis=1)
Комментарии:
1. Мое лучшее предположение было бы, что один из них
NaN
учитывает, а другой нет, например[1,2,NaN]
, даст среднее значение1
в одном случае и1.5
в другом случае. Есть ли у вас какие-либоNaN
значения? И можете ли вы попробоватьdropna()
перед вычислением среднего, чтобы увидеть, так ли это?2. Я подозреваю, что различия возникают из-за того, что вы дважды принимаете среднее значение при выполнении поворота. По умолчанию
aggfunc
np.mean
. Таким образом, вы не сравниваете одни и те же результаты. Проверьте это с помощью doingsum
вместоmean
, и вы, вероятно, получите разные результаты. Итак, вы сравниваете «Appels met peren» 🙂3. Спасибо за ваш комментарий @CutePoison, но при чтении данных я уже отбросил все NA.
4. Хороший момент. Документы ( pandas.pydata.org/docs/reference/api/pandas.pivot_table.html ) здесь указано, что
np.mean
этоagg
функция по умолчанию. Но если среднее значение уже вычислено, разве это не будет просто одна точка данных, поэтому среднее значение этого ничего не даст?5. Если вы используете
pivot
вместоpivot_table
есть исключение, что у вас повторяющиеся значения, вот ваше отличие, вы сначала объединяете их во втором фрагменте, в то время как вы используете дубликаты в первом.
Ответ №1:
Поскольку я не могу опубликовать пример кода в качестве комментария, я хочу использовать ответ @mozway о том, что причина заключается columns
в дублировании при выполнении pivot_table
df = pd.DataFrame({"total":[50,10,30,15,10,5],"state":["UC","FI","DK","LM","NA","PL"]},index=["2021-11-29"]*3 ["2021-11-30"]*3)
df.index.name = "date"
print(df) #No duplicated "state"
# total state
#date
#2021-11-29 50 UC
#2021-11-29 10 FI
#2021-11-29 30 DK
#2021-11-30 15 LM
#2021-11-30 10 NA
#2021-11-30 5 PL
df["total"].groupby(df.index).mean()
#2021-11-29 30.0
#2021-11-30 10.0
pd.pivot_table(df.reset_index(),index="date",values="total",columns="state").mean(axis=1)
#2021-11-29 30.0
#2021-11-30 10.0
как видно, это дает тот же результат, но когда мы меняем значение PL
на NA
в state
, т.е. Теперь у нас есть 2x NA
, результат для pivot_table
изменяется
df = pd.DataFrame({"total":[50,10,30,15,10,5],"state":["UC","FI","DK","LM","NA","NA"]},index=["2021-11-29"]*3 ["2021-11-30"]*3) #changed the 'PL' 'NA'
#2021-11-29 30.00
#2021-11-30 11.25 #was 10.0 before
Комментарии:
1. Спасибо, это решает проблему. В наборе данных было две строки для муниципалитета Амстердама в день. После
groupby().sum()
даты и муниципалитета проблема была решена.