【PYTHON】如何將一個DataFrame列與包含基於另一DataFrame的列的真值表一起旋轉?

2020-12-02 PYTHON

我有一個帶adf和auser_idcategory。我想將此轉換為一個真值表,以確定該使用者是否至少有一個該類別的條目。但是,最後一個表還應該包括“df_list”中出現的所有類別的列,這些列可能根本不會出現在df中。
現在,我使用groupby+size建立了truth表,然後檢查是否缺少任何列,然後手動將這些列設定為False,但我想知道是否有方法在最初的groupby步驟中完成此操作。
下面是一個例子:

import pandas as pd
df = pd.DataFrame({'user_id': [1,1,1,2,2],
                 'category': ['A', 'B', 'D', 'A', 'F']})
df_list = pd.DataFrame({'category': ['A', 'B', 'C', 'D', 'E', 'F']})

df_truth = df.groupby(['user_id', 'category']).size().unstack(fill_value=0).astype(bool)
#category     A      B      D      F
#user_id                            
#1         True   True   True  False
#2         True  False  False   True

要獲得所需的輸出,請執行以下操作:
missing_vals = df_list.category.unique()[~pd.Series(df_list.category.unique()).isin(df_truth.columns)]
for element in missing_vals:
    df_truth.loc[:,element] = False
#category     A      B      D      F      C      E
#user_id                                          
#1         True   True   True  False  False  False
#2         True  False  False   True  False  False

解決辦法

選擇1
crosstab
我建議將該列轉換為分類資料型別。crosstab/pivot將處理其餘部分。

i = df.user_id
j = pd.Categorical(df.category, categories=df_list.category)

pd.crosstab(i, j).astype(bool)

col_0       A      B      C      D      E      F
user_id                                         
1        True   True  False   True  False  False
2        True  False  False  False  False   True 

選擇2
unstack+reindex
要修復現有程式碼,可以使用reindex簡化第二步:
(df.groupby(['user_id', 'category'])
   .size()
   .unstack(fill_value=0)
   .reindex(df_list.category, axis=1, fill_value=0)
   .astype(bool)
)

category     A      B      C      D      E      F
user_id                                          
1         True   True  False   True  False  False
2         True  False  False  False  False   True

出處

Have any Question?

Let us answer it!