如何从具有多列的数据框中创建一个数据透视表 table?

How to make a pivot table from a dataframe with multiple columns?

请帮帮我。

我的数据框如下所示:

date account action
2021-01-11 504 login
2021-01-11 504 edit_profile
2021-01-11 504 logout
2021-01-12 11 login
2021-01-12 11 login
2021-01-14 303 edit_profile
2021-01-14 303 logout

我想达到的效果是这样的:

date account login edit_profile logout
2021-01-11 504 1 1 1
2021-01-12 11 2 0 0
2021-01-14 303 0 1 1

我首先想到的是数据透视表 table,但问题是我没有某些“帐户的日常操作”的总计数。如何统计每个值在一个时间范围内出现的次数?请帮忙。

这行得通吗?

获取某段时间的dataframe片段:

new_df = df[start_date < df['date'] < end_date]

new_df 现在拥有特定时间段内的所有行。 获取所有唯一帐户值:

accounts = new_df['account'].unique()

然后创建一个 for 循环来执行所有帐户操作:

# Dataframe that keeps track of the actions
actions_df 

for  account in accounts:
    # Get all the rows with certain user
    user_df = new_df[new_df['account'] == account]
    # We now have all the rows that has certain account in user_df
    for action in user_df['action']:
        if action == "login":
            actions_df[action_df['account'] == account]['login'] += 1

现在我们在 action_df 数据帧

中有了所有的动作

希望这对您有所帮助!

为了性能,尽量避免使用 pandas 的循环。有很多矢量化函数:

import pandas as pd

#recreating your sample data
from io import StringIO
data1 = """
date         account   action         
2021-01-11     504     login         
2021-01-11     504     edit_profile         
2021-01-11     504     logout         
2021-01-12     11      login         
2021-01-12     11      login         
2021-01-14     303     edit_profile         
2021-01-14     303     logout
"""
df = pd.read_csv(StringIO(data1), sep = "\s{2,}", engine="python")
df["date"] = pd.to_datetime(df["date"])


df1 = df.groupby(by=["date", "account", "action"]).size().unstack(fill_value=0)

print(df1) 

示例输出:

action              edit_profile  login  logout
date       account                             
2021-01-11 504                 1      1       1
2021-01-12 11                  0      2       0
2021-01-14 303                 1      0       1

请注意,您现在有一个 MultiIndex 数据框。您可以通过添加 .reset_index()

来删除索引级别