如何从具有多列的数据框中创建一个数据透视表 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()
来删除索引级别
请帮帮我。
我的数据框如下所示:
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()