根据现有列的部分字符串内容向新Pandas数据帧列添加值

时间:2017-11-14 16:53:11

标签: python pandas

我使用Python Pandas将数据存储为数据帧。在这些专栏中,我有一个"产品"包含品牌名称和型号的专栏(例如Nike Air Jordan,Adidas Gazelle)。我想创建一个仅包含品牌的新列(例如Nike,Adidas),稍后我将在groupby中使用它来汇总数据。 根据我的研究,我相信包含和正则表达式可以用来做到这一点。但是,实施没有奏效。我也看到了不同的方法,有些使用"对于我在范围内"而其他人则在一行代码中将其作为替代品。

import pandas as pd
import numpy as np

shoes_df = pd.DataFrame({'Product':['Nike vaporfly', 'Nike Jordans', 'Adidas supernova', 'Asics Kayano', 'Asics GT2010', 'Adidas gazelle', 'Nike air max',
                                  'Nike Lebron'], 'Unit sales':[1500, 1600,
2341, 1345, 4523, 2345, 1634, 3129]})

shoes_df['Brand'] = np.where(shoes_df['Product'].str.contains('Nike.*|Adidas.*').any(), 'Nike|Adidas', np.nan)

print(shoes_df)

这是我尝试在范围内进行的#34;"方法,也没有用。在这里,我收到了错误" TypeError:' Series'对象是可变的,因此它们不能被散列"

shoes_df = pd.DataFrame({'Product':['Nike vaporfly', 'Nike Jordans', 'Adidas supernova', 'Asics Kayano', 'Asics GT2010', 'Adidas gazelle', 'Nike air max',
                                  'Nike Lebron'], 'Unit sales':[1500, 1600, 2341, 1345, 4523,
                                   2345, 1634, 3129]})

for i in shoes_df.iterrows():
    if shoes_df['Product'].str.contains('Nike').any():
        shoes_df.set_value(i, 'Brand', 'Nike')
    elif shoes_df['Product'].str.contains('Adidas').any():
        shoes_df.set_value(i, 'Brand', 'Adidas')
    elif shoes_df['Product'].str.contains('Asics').any():
        shoes_df.set_value(i, 'Brand', 'Asics')
    else:
        shoes_df.set_value(i, 'Brand', np.nan)

3 个答案:

答案 0 :(得分:4)

选项1 (艰难之路)
str.extract

brands = ['Nike', 'Adidas', 'Asics']
df['Brand'] = df.Product.str.extract('({})'.format('|'.join(brands)), expand=True)

df

            Product  Unit sales   Brand
0     Nike vaporfly        1500    Nike
1      Nike Jordans        1600    Nike
2  Adidas supernova        2341  Adidas
3      Asics Kayano        1345   Asics
4      Asics GT2010        4523   Asics
5    Adidas gazelle        2345  Adidas
6      Nike air max        1634    Nike
7       Nike Lebron        3129    Nike

选项2 (稍微简单)
str.split

df['Brand'] = df.Product.str.split().str[0]
df

            Product  Unit sales   Brand
0     Nike vaporfly        1500    Nike
1      Nike Jordans        1600    Nike
2  Adidas supernova        2341  Adidas
3      Asics Kayano        1345   Asics
4      Asics GT2010        4523   Asics
5    Adidas gazelle        2345  Adidas
6      Nike air max        1634    Nike
7       Nike Lebron        3129    Nike

您可以对此进行扩展,以使用brands替换NaN以外的任何内容:

df['Brand'] = np.where(df.Brand.isin(brands), df.Brand, np.nan)

答案 1 :(得分:4)

IIUC:

shoes_df['brand'] = shoes_df.Product.str.extract(pat='(Nike|Adidas|Asics)',expand=False)

输出:

            Product  Unit sales   brand
0     Nike vaporfly        1500    Nike
1      Nike Jordans        1600    Nike
2  Adidas supernova        2341  Adidas
3      Asics Kayano        1345   Asics
4      Asics GT2010        4523   Asics
5    Adidas gazelle        2345  Adidas
6      Nike air max        1634    Nike
7       Nike Lebron        3129    Nike

答案 2 :(得分:0)

如果您认为该品牌始终是第一个词,那么该解决方案可让您灵活地捕捉已知列表之外的品牌,因此只需将其添加到感兴趣的内容中:

shoes_df['Product'].str.extract('^([^\s]+)\s')