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

背景


我有一个如下所示的数据集:


product_name    price

Women's pant    20.00

Men's Shirt     30.00

Women's Dress   40.00

Blue Shirt      30.00

...

我希望创建一个名为


性别


它将包含基于 product_name 中的字符串的值 Women、Men 或 Unisex


期望的结果如下所示:


product_name    price   gender

Women's pant    20.00   women

Men's Shirt     30.00   men

Women's Dress   40.00   women

Blue 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   gender

Women's pant    20.00   men

Men's Shirt     30.00   men

Women's Dress   40.00   men

Blue Shirt      30.00   men

我非常感谢这里的一些帮助,因为我是 python 和 pandas 库的新手。


翻翻过去那场雪
浏览 228回答 4
4回答

米脂

您可以使用列表理解来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    gender0   Women's pant    20.0    women1   Men's Shirt     30.0    men2   Women's Dress   40.0    women3   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 的迭代要快得多;你必须测试一下。

富国沪深

尝试将您的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

大话西游666

您也可以使用np.where+ Series.str.contains,import numpy as npdf['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  gender0   Women's pant   20.0   women1    Men's Shirt   30.0     men2  Women's Dress   40.0   women3     Blue Shirt   30.0  unisex

潇潇雨雨

在短语中使用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  gender0   Women's pant   20.0   Women1    Men's Shirt   30.0     Men2  Women's Dress  640.0   Women3    Blue Shirt    30.0  Unisex
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python