Python:当所需的索引系列有重复项时,对 pandas DataFrame 进行透视
Python: pivot a pandas DataFrame when the desired index Series has duplicates
我有一个 pandas DataFrame my_data
看起来像
event_id user_id attended
0 13 345 1
1 14 654 0
...
所以 event_id
和 user_id
都有重复项,因为每个用户和事件组合都有一个条目。我想要做的是将其重塑为一个 DataFrame,其中我的索引(行)是 DISTINCT user_id
,列是 DISTINCT event_id
,给定的值(行,列) 只是他们是否参加的布尔值 0 或 1。
似乎 pivot
方法是合适的,但当然当我尝试 my_data.pivot(index='user_id', columns='event_id', values='attended')
时,我得到了索引重复的错误。
我想我应该先在 user_id
上做一些 groupby
,但我不想把每个 attended
的 1 和 0 加起来用户,因为我特别想将 event_id
作为我的新列分开,并将每个用户参加的事件分开。
任何帮助将不胜感激,谢谢!
IIUC,pivot_table
应该给你你想要的:
>>> df = pd.DataFrame({"event_id": np.random.randint(10, 20, 20), "user_id": np.random.randint(100, 110, 20), "attended": np.random.randint(0, 2, 20)})
>>> df.pivot_table(index="user_id", columns="event_id", values="attended",
aggfunc=sum).fillna(0)
event_id 10 11 12 13 14 15 16 17 19
user_id
101 0 0 0 1 0 0 0 0 0
103 0 0 0 0 0 0 0 0 0
104 0 0 0 0 0 0 0 0 1
105 0 0 0 0 0 0 0 0 0
106 0 0 0 0 0 0 1 0 0
107 1 0 0 0 0 0 0 1 0
108 0 0 0 1 0 0 0 0 0
109 0 0 0 0 1 0 1 0 0
如所写,如果有多行具有相同的 user/event 组合(可能不是这种情况),则出勤率将相加。如果您想保证帧仅由 0 和 1 组成,那么使用 any
或剪切值就足够了。
我有一个 pandas DataFrame my_data
看起来像
event_id user_id attended
0 13 345 1
1 14 654 0
...
所以 event_id
和 user_id
都有重复项,因为每个用户和事件组合都有一个条目。我想要做的是将其重塑为一个 DataFrame,其中我的索引(行)是 DISTINCT user_id
,列是 DISTINCT event_id
,给定的值(行,列) 只是他们是否参加的布尔值 0 或 1。
似乎 pivot
方法是合适的,但当然当我尝试 my_data.pivot(index='user_id', columns='event_id', values='attended')
时,我得到了索引重复的错误。
我想我应该先在 user_id
上做一些 groupby
,但我不想把每个 attended
的 1 和 0 加起来用户,因为我特别想将 event_id
作为我的新列分开,并将每个用户参加的事件分开。
任何帮助将不胜感激,谢谢!
IIUC,pivot_table
应该给你你想要的:
>>> df = pd.DataFrame({"event_id": np.random.randint(10, 20, 20), "user_id": np.random.randint(100, 110, 20), "attended": np.random.randint(0, 2, 20)})
>>> df.pivot_table(index="user_id", columns="event_id", values="attended",
aggfunc=sum).fillna(0)
event_id 10 11 12 13 14 15 16 17 19
user_id
101 0 0 0 1 0 0 0 0 0
103 0 0 0 0 0 0 0 0 0
104 0 0 0 0 0 0 0 0 1
105 0 0 0 0 0 0 0 0 0
106 0 0 0 0 0 0 1 0 0
107 1 0 0 0 0 0 0 1 0
108 0 0 0 1 0 0 0 0 0
109 0 0 0 0 1 0 1 0 0
如所写,如果有多行具有相同的 user/event 组合(可能不是这种情况),则出勤率将相加。如果您想保证帧仅由 0 和 1 组成,那么使用 any
或剪切值就足够了。