我是新手,如果我使用了錯誤的術語,請見諒。我有一個包含客戶購買資訊的 df,客戶由唯一的 user_id 標識。user_id 在每筆交易中購買的每件商品都會創建一個新行(如果客戶在 1 筆交易中購買了 5 種產品,則會使用該產品資訊創建 5 行)。
我使用 loc 函式基于 4 個變數(收入、年齡、部門 ID 和父母身份)創建了客戶資料。它奏效了,然而,結果不是我想要的。df 中有 106,143 個客戶,30,964,564 行。我創建的組態檔(年輕的父母、年輕的單身成人、收入較高的人、60 歲以上、其他 ['other' 來捕獲未分配到其他組態檔中的任何內容])被分配給每一行,而不是分配給每個 user_id,例如 user_id 1購買 5 件商品,其中 1 件符合“年輕父母”的條件,其余為“其他”。這是我的代碼:
# create flag for 'High earner' (age: 40-59, income: 400000 , department_id: 1, 4, 7, 19, 16, parental_status: Parent)
final_df.loc[(final_df['age_range'].isin(['40-49', '50-59'])) & (final_df['income'] >= 400000) & (final_df['department_id'].isin([1, 4, 7, 19, 16])) & (final_df['parental_status'] == 'Parent'), 'customer_profile'] = 'Higher earner'
# create flag for 'Young single adult' (age: <39, income: <=199999, department_id: 1, 4, 7, 19, parental_status: Non-parent)
final_df.loc[(final_df['age'] <= 39) & (final_df['income'] <= 199999) & (final_df['department_id'].isin([1, 4, 7, 19])) & (final_df['parental_status'] == 'Non-parent'), 'customer_profile'] = 'Young single adult'
# create flag for 'Young parent' (age: 20-39, income: <=199999, department_id: 4, 13, 16, 17, 18 parental_status: Parent)
final_df.loc[(final_df['age_range'].isin(['20-29', '30-39'])) & (final_df['income'] <= 199999) & (final_df['department_id'].isin([4, 13, 16, 17, 18])) & (final_df['parental_status'] == 'Parent'), 'customer_profile'] = 'Young parent'
# create flag for 'Over 60' (age: 60 , income: <=199999, department_id: 1, 4, 11, 12, 15, 20 parental_status: Parent)
final_df.loc[(final_df['age'] >= 60) & (final_df['income'] <= 199999) & (final_df['department_id'].isin([1, 4, 11, 12, 15, 20])) & (final_df['parental_status'] == 'Parent'), 'customer_profile'] = 'Over 60'
# impute all NaN values as 'Other'
final_df['customer_profile'].fillna('Other', inplace=True)
這是結果:
user_id customer_profile
0 1 Other
1 1 Other
2 1 Other
3 1 Other
4 1 Other
5 1 Other
6 1 Other
7 1 Other
8 1 Other
9 1 Other
10 1 Young parent
11 1 Other
12 1 Other
13 1 Other
14 1 Other
15 1 Other
16 1 Other
17 1 Other
18 1 Other
19 1 Other
20 1 Other
21 1 Other
22 1 Other
23 1 Young parent
24 1 Young parent
我真正想要的是,“如果將‘年輕父母’(或任何個人資料)分配給 user_id 一次,那么該 user_id 的所有‘其他’也必須更改為‘年輕父母’”(客戶不能有 2 個個人資料!)。因此,上述結果應在每一行中顯示“年輕的父母”。
這可能嗎?我是否使用了錯誤的功能?我的知識有限,任何建議將不勝感激!
uj5u.com熱心網友回復:
Mask列中的Other值customer_profile,然后group按列user_id和transformwithfirst選擇第一個非 nan 值user_id
m = df['customer_profile'].eq('Other')
df['customer_profile'] = df['customer_profile'].mask(m)\
.groupby(df['user_id']).transform('first')
為了進一步簡化這一點,您可以跳過代碼中fillna用于填充Other值的最后一步,因為要使用 groupby,我們必須將此值屏蔽回NaN. 所以fillna是一個多余的步驟。
df['customer_profile'] = df.groupby('user_id')['customer_profile'].transform('first')
user_id customer_profile
0 1 Young parent
1 1 Young parent
2 1 Young parent
3 1 Young parent
4 1 Young parent
5 1 Young parent
6 1 Young parent
7 1 Young parent
...
23 1 Young parent
24 1 Young parent
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369901.html
上一篇:生成一列時間
