Сгруппировать год и другой столбец и рассчитать среднее значение, исходя из указанных c условий pandas - PullRequest
2 голосов
/ 25 января 2020

У меня есть фрейм данных, как показано ниже

Tenancy_ID      Unit_ID             End_Date       Rental_value
1               A                   2012-04-26     10
2               A                   2012-08-27     20
3               A                   2013-04-27     50
4               A                   2014-04-27     40
1               B                   2011-06-26     10
2               B                   2011-09-27     30
3               B                   2013-04-27     60
4               B                   2015-04-27     80

Из вышеизложенного я хотел бы подготовить ниже фрейм данных

Ожидаемый результат:

Unit_ID   Avg_2011   Avg_2012  Avg_2013  Avg_2014   Avg_2015
A         NaN            15        50        40         NaN
B         20             NaN       60        NaN        80

Шаги :

  • Unit_ID = A, имеет два контракта в 2012 году со стоимостью аренды 10 и 20, следовательно, среднее значение составляет 15.

  • Avg_2012 = Среднее Стоимость аренды в 2012 году.

Ответы [ 2 ]

4 голосов
/ 25 января 2020

Используйте pivot_table напрямую с s.dt.year

#df['End_Date']=pd.to_datetime(df['End_Date']) if dtype of End_Date is not datetime

final = (df.pivot_table('Rental_value','Unit_ID',df['End_Date'].dt.year)
        .add_prefix('Avg_').reset_index().rename_axis(None,axis=1))

print(final)

  Unit_ID  Avg_2011  Avg_2012  Avg_2013  Avg_2014  Avg_2015
0       A       NaN      15.0      50.0      40.0       NaN
1       B      20.0       NaN      60.0       NaN      80.0
3 голосов
/ 25 января 2020

Вы можете агрегировать средние значения и изменять их на Series.unstack, имена столбцов последних изменений - на DataFrame.add_prefix, а последние данные очищать - DataFrame.reset_index с помощью DataFrame.rename_axis:

df1 = (df.groupby(['Unit_ID', df['End_Date'].dt.year])['Rental_value']
         .mean()
         .unstack()
         .add_prefix('Avg_')
         .reset_index()
         .rename_axis(None, axis=1))
print (df1)
  Unit_ID  Avg_2011  Avg_2012  Avg_2013  Avg_2014  Avg_2015
0       A       NaN      15.0      50.0      40.0       NaN
1       B      20.0       NaN      60.0       NaN      80.0
...