有没有比循环遍历数据框更好的方法将数据框转换为 "truth table"?

Is there a better way to transform a data frame into a "truth table" than looping through it?

我在 Redshift 中有一个视图,我正在从中读取以创建数据框。 table 的结构如下,大约有 49k 条记录:

session_id timestamp event_text
session1 2020-07-07 06:45:45.012 event-A
session1 2020-07-10 04:19:07.477 event-B
session2 2020-07-10 16:42:24.46 event-B
session2 2020-07-10 18:57:12.358 event-C
session3 2020-07-10 16:42:24.46 event-A
session3 2020-07-10 18:57:12.358 event-C

我的目标是创建一个结构如下的数据框:

session_id event-A event-B event-C
session1 1 1 0
session2 0 1 1
session3 1 0 1

我知道这个结构是“真相table”,但不确定其他人怎么称呼它。

我在 Python 中找到了一种通过循环查询结果来执行此操作的方法,如下所示:

import pandas as pd
import pandas.io.sql as sqlio

# Redshift query
df = sqlio.read_sql_query(master_order_event_view, conn) 

events = df.event_text.unique()
unique_sessions = df.session_id.unique()

# Creating Dataframe with session IDs as index and event_text values as columns
truth_df = pd.DataFrame(0, index=unique_sessions, columns=events) 

for session_id, event_text in zip(df["session_id"], df["event_text"]):
    truth_df.at[session_id, event_text] = 1
    
return truth_df

我的问题是:是否有内置的 Pandas command/library 来执行此操作?我看了很多文档,但找不到任何令它满意的东西。也许称之为“真相table”是我的问题。

无论是否有内置方法可以做到这一点,有人对如何提高效率有任何建议吗?重构视图,使用不同的库等

谢谢!

感谢@Dani Mesejo 和@sammywemmy,他们给了我一些建议。

for session_id, event_text in zip(df["session_id"], df["event_text"]):
    truth_df.at[session_id, event_text] = 1

可替换为以下任意一项:

使用交叉表:

truth_df = pd.crosstab(df.session_id, df.event_text)

或分组依据:

truth_df = df.groupby(["session_id", "event_text"]).size().unstack(fill_value=0)

两者都很好用,但根据@sammywemmy 的说法,groupby 的速度要快一些。