如何解决有没有比循环遍历数据框更好的方法将数据框转换为“真值表”?
我在 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 命令/库来执行此操作?我环顾了很多文档,但找不到任何满意的内容。也许称它为“真值表”是我的问题。
无论是否有内置的方法可以做到这一点,有人对如何提高效率有任何建议吗?重构视图、使用不同的库等
谢谢!
解决方法
感谢@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 的速度要快一些。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。