Округление до десятичных знаков в совокупности по группам pandas python - PullRequest
0 голосов
/ 05 января 2020

df

order_date    Month Name   Year   Days  Data
2015-12-20     Dec         2014    1     3
2016-1-21      Jan         2014    2     3
2015-08-20     Aug         2015    1     1 
2016-04-12     Apr         2016    4     1

and so on

Код: (поиск столбца среднего, минимального и медианного числа дней и определение количества порядковых дат по месяцам для каждого соответствующего года)

df1 = (df.groupby(["Year", "Month Name"])
     .agg(Min_days=("days", 'min'),
          Avg_days=("days", 'mean'),
          Median_days=('days','median'),
          Count = ('order_date', 'count'))
     .reset_index())

df1

   Year Month Name  Min_days    Avg_days    Median_days     Count
    2015   Jan       9        12.56666666          10         4
    2015   Feb       10       13.67678788          9          3    
   ........................................................
    2016   Jan       12       15.7889990           19          2
    and so on...

Проблема в наличии:

Я получаю средние значения столбца Avg_Days с более чем 5 десятичными разрядами. Я хочу округлить значения средних до 2 десятичных знаков. Как я могу сделать это в коде?

Ответы [ 2 ]

3 голосов
/ 05 января 2020

Просто добавьте .round(2) после reset_index(). Он обойдет все плавающие колонны

df1 = (df.groupby(["Year", "Month Name"])
     .agg(Min_days=("Days", 'min'),
          Avg_days=("Days", 'mean'),
          Median_days=('Days','median'),
          Count = ('order_date', 'count'))
     .reset_index().round(2))
2 голосов
/ 05 января 2020

Это возможно с помощью пользовательской функции:

def round_mean(x):
    return round(x.mean(), 2)

df1 = (df.groupby(["Year", "Month Name"])
     .agg(Min_days=("Days", 'min'),
          Avg_days=("Days", round_mean),
          Median_days=('Days','median'),
          Count = ('order_date', 'count'))
     .reset_index())

print (df1)
   Year Month Name  Min_days  Avg_days  Median_days  Count
0  2014        Dec         1         1            1      1
1  2014        Jan         2         2            2      1
2  2015        Aug         1         1            1      1
3  2016        Apr         4         4            4      1

К сожалению, лямбда-функция еще не работает:

df1 = (df.groupby(["Year", "Month Name"])
     .agg(Min_days=("Days", 'min'),
          Avg_days=("Days", lambda x: round(x.mean(), 2)),
          Median_days=('Days','median'),
          Count = ('order_date', 'count'))
     .reset_index())

KeyError: "[('Days', '')] не в индексе "

Но проще круглые значения после:

df1 = (df.groupby(["Year", "Month Name"])
     .agg(Min_days=("Days", 'min'),
          Avg_days=("Days", 'mean'),
          Median_days=('Days','median'),
          Count = ('order_date', 'count'))
     .reset_index())

df1['Avg_days'] = df1['Avg_days'].round(2) 
...