按日期和列分组

Group by Date and Column

我有一个数据框:

Date_time           | Available
21/10/2020 05:00:01 |   Yes
21/10/2020 12:20:01 |   No
22/10/2020 04:30:01 |   Yes
22/10/2020 03:40:01 |   Yes
22/10/2020 01:50:01 |   No
23/10/2020 02:10:01 |   Yes
23/10/2020 11:30:01 |   Yes

我想复制 SQL 的案例状态并在 Python 中分组。

SELECT date,
       sum(case when Available = 'Yes' then 1 else 0 end)*100/count(*) as Available_rate 
FROM table
group by date

我要找的是:

Date        | Available_rate 
21/10/2020  |   50
22/10/2020  |   66.667
23/10/2020  |   100

我可以在 python 中做到这一点:

daily_count = df.groupby([df['date'].dt.date]).size().reset_index(name='counts')

我不确定如何更进一步。

您可以将“Available”转换为布尔值,并使用 GroupBy.mean,这将利用 True/1 和 False/0 等价关系为您提供汇率:

out = (df['Available']
       .eq('Yes')
       .groupby(df['Date'])
       .mean()
       .mul(100)
       )

输出:

Date
21/10/2020     50.000000
22/10/2020     66.666667
23/10/2020    100.000000
Name: Available, dtype: float64
替代格式:
out = (df['Available']
       .eq('Yes')
       .groupby(df['Date'])
       .mean()
       .mul(100)
       .rename('available rate')
       .reset_index()
       )

这是替代解决方案,使用 pd.pivot_table:

x = pd.pivot_table(
    df.assign(Available_mean=df["Available"].eq("Yes")),
    index="Date",
    values="Available_mean",
    aggfunc="mean",
)

print(x * 100)

打印:

            Available_mean
Date                      
2020-10-21       50.000000
2020-10-22       66.666667
2020-10-23      100.000000