有没有比循环遍历数据框更好的方法将数据框转换为 "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 的速度要快一些。
我在 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 的速度要快一些。