有没有比循环遍历数据框更好的方法将数据框转换为“真值表”?

时间:2020-12-28 20:52:22

标签: python pandas dataframe truthtable

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

<头>
session_id 时间戳 event_text
session1 2020-07-07 06:45:45.012 事件-A
session1 2020-07-10 04:19:07.477 事件-B
session2 2020-07-10 16:42:24.46 事件-B
session2 2020-07-10 18:57:12.358 event-C
session3 2020-07-10 16:42:24.46 事件-A
session3 2020-07-10 18:57:12.358 event-C

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

<头>
session_id 事件-A event-B event-C
session1 1 1 0
session2 0 1 1
session3 1 0 1

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

我找到了一种在 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 命令/库来执行此操作?我环顾了很多文档,但找不到任何满意的内容。也许称它为“真值表”是我的问题。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

感谢@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 的速度要快一些。