繁体   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