簡體   English   中英

創建反向虛擬變量

[英]Creating a reverse dummy variable

我想從我的 dataframe 的不同列創建一個反向虛擬變量。

dataframe 列如下所示:

client  booking_by_phone  booking_online  booking_online  ...  no_call_ad  no_sms_ad  no_ad_other
2q332   1                 0               0                    1           1          0
as4e3   0                 0               1                    0           0          0
ad222   0                 1               0                    1           0          0
q2x31   1                 0               0                    1           1          1

我目前的方法運行成功,但自從我使用iterrows()以來需要很長時間

for idx, _ in df.iterrows():
    if df.loc[idx, 'booking_by_phone'] == 1:
        df.loc[idx, 'bookingchannel'] = "phone"
    elif df.loc[idx, 'booking_online'] == 1:
        df.loc[idx, 'bookingchannel'] = "online"
    else:
        df.loc[idx, 'bookingchannel'] = "agency"
        

對於第二個變量,它需要更長的時間,因為用戶可能拒絕了多個頻道的廣告,所以我不能使用 elif:

for idx, _ in df.iterrows():
    df.loc[idx, 'ad_ban'] = 0
    if df.loc[idx, 'no_email_ad'] == 1:
        df.loc[idx, 'ad_ban'] += 1
    if df.loc[idx, 'no_mail_ad'] == 1:
        df.loc[idx, 'ad_ban'] += 2
    if df.loc[idx, 'no_call_ad'] == 1:
        df.loc[idx, 'ad_ban'] += 4
    if df.loc[idx, 'no_catalog_ad'] == 1:
        df.loc[idx, 'ad_ban'] += 8
    if df.loc[idx, 'no_sms_ad'] == 1:
        df.loc[idx, 'ad_ban'] += 16
    if df.loc[idx, 'no_ad_other'] == 1:
        df.loc[idx, 'ad_ban'] += 32

有沒有更快更簡單的方法來做到這一點?

讓我們看看預訂渠道。 這是使用 boolean 掩碼的方法:

df['booking channel'] = 'agency' # default value

mask = df['booking_by_phone'] == 1
df.loc[mask, 'booking channel'] = 'phone'

mask = df['booking_online'] == 1
df.loc[mask, 'booking channel'] = 'online'

您可以創建一個元組列表 - [('booking_by_phone', 'phone'), ('booking_online', 'online'), ...] 並在循環中執行分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM