我的資料框(df)是一個 12 個月的資料,由 5m 行組成。其中一列是day_of_week星期一到星期日。此 df 也有一個唯一鍵,即ride_id列。我想計算每天 day_of_week 的平均騎行次數。我計算了每天 day_of_week 的騎行次數
copydf.groupby(['day_of_week']).agg(number_of_rides=('day_of_week', 'count'))
但是,我發現很難計算一周中每一天的平均值/平均值。我努力了:
copydf.groupby(['day_of_week']).agg(number_of_rides=('ride_id', 'count')).mean()
和
avg_days = copydf.groupby(['day_of_week']).agg(number_of_rides=('ride_id', 'count'))
avg_days.groupby(['day_of_week']).agg('number_of_rides', 'mean')
他們沒有作業。我希望輸出在三列中,day_of_week、number_of_rides 和 avg_num_of_ride 或兩列 day_of_week 或 weekday_num 和 avg_num_of_rides
這是我的df。請注意,由于列名長,代碼塊已篡改了某些列行。
ride_id rideable_type started_at ended_at start_station_name start_station_id end_station_name end_station_id start_lat start_lng end_lat end_lng member_or_casual ride_length year month day_of_week hour weekday_num
0 9DC7B962304CBFD8 electric_bike 2021-09-28 16:07:10 2021-09-28 16:09:54 Streeter Dr & Grand Ave 13022 Streeter Dr & Grand Ave 13022 41.89 -87.68 41.89 -87.67 casual 2 2021 September Tuesday 16 1
1 F930E2C6872D6B32 electric_bike 2021-09-28 14:24:51 2021-09-28 14:40:05 Streeter Dr & Grand Ave 13022 Streeter Dr & Grand Ave 13022 41.94 -87.64 41.98 -87.67 casual 15 2021 September Tuesday 14 1
2 6EF72137900BB910 electric_bike 2021-09-28 00:20:16 2021-09-28 00:23:57 Streeter Dr & Grand Ave 13022 Streeter Dr & Grand Ave 13022 41.81 -87.72 41.80 -87.72 casual 3 2021 September Tuesday 0 1
這是我想要的輸出
number_of_rides average_number_of_rides
day_of_week
Saturday 964079 50.4
Sunday 841919 70.9
Wednesday 840272 90.2
Thursday 836973 77.2
Friday 818205 34.4
Tuesday 814496 34.4
Monday 767002 200.3
同樣,我已經計算了每天 day_of_week 的騎行次數,我想要做的只是添加第三列或更好的是,每個作業日(星期一或 0、星期二或 1、星期三或 2)在其自己的輸出 df 上具有 average_ride
謝謝
uj5u.com熱心網友回復:
據我了解,您不是在嘗試計算分組資料中某個欄位的平均值(正如@Azhar Khan 指出的那樣),而是在最初的 12 個月期間每個作業日的平均乘車次數。
基本上,您需要兩個元素:
- 首先,您在資料框中觀察到的每個作業日的騎行次數。這正是你得到的
copydf.groupby(['day_of_week']).agg(number_of_rides=('ride_id', 'count'))讓我們說你得到類似的東西:

- 其次,計算您月經期間的作業日數。假設您以 2022 年為例,您可以使用以下代碼片段獲取此類資料:
df_year = pd.DataFrame(data=pd.date_range(start=pd.to_datetime('01-01-2022'),
end=pd.to_datetime('31-12-2022'),
freq='1D'),
columns=['date'])
df_year["day_of_week"] = df_year["date"].dt.weekday
nb_weekdays_in_year = df_year.groupby('day_of_week').agg(nb_days=('date', 'count'))
這給出了這樣一個資料框:

一旦你擁有了這兩個資料框,你可以簡單地將它們連接起來
nb_weekdays_in_year.join(nb_rides_per_day),你只需要執行兩個列的比率來獲得你的平均值。
這里的困難在于你需要得到你所經歷的每種型別的作業日總數,我猜你不能直接從你的觀察中得到(如果有一些缺失值怎么辦?)。另外,讓我們強調一下,您并不是要獲得組內平均值,因此您不能直接使用簡單的 agg 函式,例如“mean”。
uj5u.com熱心網友回復:
要獲得每周平均騎行次數,您需要該作業日的總騎行次數和周數。
您可以從日期計算周數:
df["week_number"] = df["started_at"].dt.isocalendar().week
>> ride_id started_at day_of_week week_number
>> 0 1 2021-09-20 Monday 38
>> 1 2 2021-09-21 Tuesday 38
>> 2 3 2021-09-20 Monday 38
>> 3 4 2021-09-21 Tuesday 38
>> 4 5 2021-09-27 Monday 39
>> 5 6 2021-09-28 Tuesday 39
然后分組day_of_week并week_number計算聚合資料幀:
week_number_group_df = df.groupby(["day_of_week", "week_number"]).agg(number_of_rides_on_day=("ride_id", "count"))
>> number_of_rides_on_day
>> day_of_week week_number
>> Monday 38 2
>> 39 1
>> Tuesday 38 2
>> 39 1
使用聚合資料框獲得最終結果:
week_number_group_df.groupby("day_of_week").agg(number_of_rides=("number_of_rides_on_day", "sum"), average_number_of_rides=("number_of_rides_on_day", "mean"))
>> number_of_rides average_number_of_rides
>> day_of_week
>> Monday 3 1.5000
>> Tuesday 3 1.5000
uj5u.com熱心網友回復:
使用樞軸我們可以解決這個問題。
import pandas as pd
import numpy as np
df = pd.read_csv('/content/test.csv')
df.head()
# sample df
date rides
0 2019-10-01 1
1 2019-10-02 2
2 2019-10-03 5
3 2019-10-04 3
4 2019-10-05 2
df['date] = pd.to_datetime(df['date'])
# extracting the week Number
df['weekNo'] = df['date'].dt.week
date rides weekNo
0 2019-10-01 1 40
1 2019-10-02 2 40
2 2019-10-03 5 40
方法一:使用資料透視表
df.pivot_table(values='rides',index='weekNo',aggfunc='mean')
輸出
rides
weekNo
40 2.833333
41 2.571429
42 4.000000
方法二:使用 groupby.mean()
df.groupby('weekNo')['rides'].mean()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516051.html
