为了账号安全,请及时绑定邮箱和手机立即绑定

根据条件填充数据框行的值

根据条件填充数据框行的值

翻翻过去那场雪 2023-03-08 14:49:42
背景我有一个如下所示的数据集:product_name    priceWomen's pant    20.00Men's Shirt     30.00Women's Dress   40.00Blue Shirt      30.00...我希望创建一个名为性别它将包含基于 product_name 中的字符串的值 Women、Men 或 Unisex期望的结果如下所示:product_name    price   genderWomen's pant    20.00   womenMen's Shirt     30.00   menWomen's Dress   40.00   womenBlue Shirt      30.00   unisex我的方法我想首先我应该创建一个新列,每行都有一个空白值。然后我应该遍历数据框中的每一行并检查字符串 df[product_name] 以查看它是男装、女装还是中性并填写相应的性别行值。这是我的代码:df['gender'] = ""for product_name in df['product_name']:    if 'women' in product_name.lower():        df['gender'] = 'women'    elif 'men' in product_name.lower():        df['gender'] = 'men'    else:        df['gender'] = 'unisex'但是,我得到以下结果:product_name    price   genderWomen's pant    20.00   menMen's Shirt     30.00   menWomen's Dress   40.00   menBlue Shirt      30.00   men我非常感谢这里的一些帮助,因为我是 python 和 pandas 库的新手。
查看完整描述

4 回答

?
米脂

TA贡献1836条经验 获得超3个赞

您可以使用列表理解来if/else获取输出:


df['gender'] = ['women' if 'women' in word 

                else "men" if "men" in word

                else "unisex" 

                for word in df.product_name.str.lower()]


df


   product_name    price    gender

0   Women's pant    20.0    women

1   Men's Shirt     30.0    men

2   Women's Dress   40.0    women

3   Blue Shirt      30.0    unisex

或者,您可以使用numpy select来获得相同的结果:


cond1 = df.product_name.str.lower().str.contains("women")

cond2 = df.product_name.str.lower().str.contains("men")

condlist = [cond1, cond2]

choicelist = ["women", "men"]

df["gender"] = np.select(condlist, choicelist, default="unisex")

通常,对于字符串,python 的迭代要快得多;你必须测试一下。


查看完整回答
反对 回复 2023-03-08
?
富国沪深

TA贡献1790条经验 获得超9个赞

尝试将您的for语句转换为函数并使用apply. 所以像 -


def label_gender(product_name):

    '''product_name is a str'''

    if 'women' in product_name.lower():

        return 'women'

    elif 'men' in product_name.lower():

        return 'men'

    else:

        return 'unisex'


df['gender'] = df.apply(lambda x: label_gender(x['product_name']),axis=1)

可以在这里找到使用 apply/lambda 的详细分类:https ://towardsdatascience.com/apply-and-lambda-usage-in-pandas-b13a1ea037f7


查看完整回答
反对 回复 2023-03-08
?
大话西游666

TA贡献1817条经验 获得超14个赞

您也可以使用np.whereSeries.str.contains,


import numpy as np


df['gender'] = (

    np.where(df.product_name.str.contains("women", case=False), 'women',

             np.where(df.product_name.str.contains("men", case=False), "men", 'unisex'))

)

    product_name  price  gender

0   Women's pant   20.0   women

1    Men's Shirt   30.0     men

2  Women's Dress   40.0   women

3     Blue Shirt   30.0  unisex


查看完整回答
反对 回复 2023-03-08
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

在短语中使用np.where .str.containsand regex firstword`。以便;


#np.where(if product_name has WomenORMen, 1st Word in Phrase, otherwise;unisex)




 df['Gender']=np.where(df.product_name.str.contains('Women|Men')\

                      ,df.product_name.str.split('(^[\w]+)').str[1],'Unisex')



 

    product_name  price  gender

0   Women's pant   20.0   Women

1    Men's Shirt   30.0     Men

2  Women's Dress  640.0   Women

3    Blue Shirt    30.0  Unisex


查看完整回答
反对 回复 2023-03-08
  • 4 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号