pandas 如何计算用户名和周数组合的平均天数?

qmb5sa22  于 2023-02-02  发布在  其他
关注(0)|答案(1)|浏览(105)

我有一个用户活动的 Dataframe ,如下所示:
| 识别号|星期|日期|
| - ------|- ------|- ------|
| 1个|1个|2022年7月23日|
| 1个|1个|2022年7月24日|
| 1个|第二章|2022年7月29日|
| 1个|第二章|2022年7月30日|
| 1个|第二章|2022年8月1日|
| 第二章|1个|2022年7月22日|
| 第二章|第二章|2022年7月29日|
| 第二章|第二章|2022年8月2日|
第1周有3天:2022年7月22日(第1天)、2022年7月23日(第2天)、2022年7月24日(第3天)
第2周有4天:2022年7月29日(第1天)、2022年7月30日(第2天)、2022年8月1日(第3天)、2022年8月2日(第4天)
我需要平均天数作为一个新的列:ID为1的用户在第1周的第2天和第3天访问了站点,因此平均值为2.5。
我需要的输出是:
| 识别号|星期|平均_天|
| - ------|- ------|- ------|
| 1个|1个|二、五|
| 1个|第二章|第二章|
| 第二章|1个|1个|
| 第二章|第二章|二、五|
我希望我的问题是明确的,我不知道如何开始,将感谢您的帮助!谢谢!

fnvucqvd

fnvucqvd1#

使用您提供的 Dataframe :

import pandas as pd

df = pd.DataFrame(
    {
        "ID": [1, 1, 1, 1, 1, 2, 2, 2],
        "week": [1, 1, 2, 2, 2, 1, 2, 2],
        "date": [
            "23/07/22",
            "24/07/22",
            "29/07/22",
            "30/07/22",
            "01/08/22",
            "22/07/22",
            "29/07/22",
            "02/08/22",
        ],
    }
)

下面是使用Pandas groupbyapplyexplodeconcat方法执行此操作的一种方法:

# Prep data
df["date"] = pd.to_datetime(df["date"], dayfirst=True)
df = df.sort_values(["week", "date"]).reset_index(drop=True)

# Add day number to df as new column "day_num"
tmp = df.groupby("week").agg(set)
tmp["day_num"] = tmp.apply(lambda x: [i + 1 for i in range(len(x["date"]))], axis=1)
tmp["date"] = tmp["date"].apply(sorted)
tmp = tmp.explode(["date", "day_num"])
df = pd.concat([df.set_index('date'), tmp.set_index('date').drop(columns="ID")], axis=1)

# Evaluate mean as new column "mean_day"
df = (
    df.sort_values(["ID", "week"])
    .groupby(["ID", "week"])
    .agg(pd.DataFrame.mean)
    .reset_index()
    .rename(columns={"date": "mean_day"})
)

然后:

print(df)
# Output
   ID  week  day_num
0   1     1      2.5
1   1     2      2.0
2   2     1      1.0
3   2     2      2.5

相关问题