Как решить различия в вычислении `среднего`

#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 . Таким образом, вы не сравниваете одни и те же результаты. Проверьте это с помощью doing sum вместо 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() даты и муниципалитета проблема была решена.