我在下面有一個資料框:
df = pd.DataFrame({'channels' : ['EMAIL','FAX','MAIL','PHONE','Marketing','SMS','VISIT','Profiling','Approved_Email','EMAIL','FAX','MAIL','PHONE','Marketing','SMS','VISIT','Profiling','Approved_Email_vod'],
'ID' : [1001, 1002, 1003, 1004, 1005, 1006, 1001, 1002, 1003, 1004, 1005, 1006, 1001, 1002, 1003, 1004, 1005, 1006],
'INTR_COUNT' : [1,1,1,1,1,1,1,2,3,4,5,6,1,2,3,4,5,6],
'PERSONA' : ['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C']})
我想要做的是定義一個函式,該函式將采用上述 df 并根據“通道”中的唯一類別創建新列。
| ID | 電子郵件 | 傳真 | 郵件 | 電話 | 短信 | 訪問 | 營銷 | 已批準_電子郵件 | 角色 |
|---|---|---|---|---|---|---|---|---|---|
| 1001 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 一種 |
其余的 ID 依此類推
到目前為止,我已經撰寫了這個函式:
def channel_pivot(df: pd.DataFrame):
#where df is the df stated above
x = df
#subsetting to pivot only on focus cols
y = df[['channels', 'INTR', 'HCP']]
#pivot operation
y = set_index('ID')
y1 = y.pivot(columns='channels', values = sum('INTR')).apply(lambda x: pd.Series(x.dropna().values))
df1 = y1.merge(x, left_index=True, right_on='ID')
return df1
但是,我無法讓 sum 函式在 pivot 函式中作業,那么如何匯總每個通道的給定 ID 的互動計數?
uj5u.com熱心網友回復:
您可以.groupby()使用.agg():
x = (
df.groupby(["ID", "channels"])
.agg({"INTR_COUNT": "sum", "PERSONA": "first"})
.set_index("PERSONA", append=True)
.unstack(level=1)
.droplevel(0, axis=1)
.fillna(0)
.astype(int)
.reset_index()
)
x.columns.name = None
print(x)
印刷:
| ID | 角色 | 已批準_電子郵件 | 已批準_Email_vod | 電子郵件 | 傳真 | 郵件 | 營銷 | 電話 | 剖析 | 短信 | 訪問 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1001 | 一種 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
| 1 | 1002 | 乙 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 2 | 0 | 0 |
| 2 | 1003 | C | 3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 3 | 0 |
| 3 | 1004 | 一種 | 0 | 0 | 4 | 0 | 0 | 0 | 1 | 0 | 0 | 4 |
| 4 | 1005 | 乙 | 0 | 0 | 0 | 5 | 0 | 1 | 0 | 5 | 0 | 0 |
| 5 | 1006 | C | 0 | 6 | 0 | 0 | 6 | 0 | 0 | 0 | 1 | 0 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/459175.html
