首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据现有列的部分字符串内容向新的Pandas dataframe列添加值

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

Stack Overflow用户
提问于 2017-11-14 16:53:11
回答 3查看 2.3K关注 0票数 1

我使用Pandas将数据存储为数据。在这些专栏中,我有一个“产品”栏,其中包含品牌名称和型号(例如耐克、约旦航空、阿迪达斯、瞪羚)。我想要创建一个新的专栏,其中只包含品牌(例如耐克,阿迪达斯),我稍后将在群组中使用它来总结数据。根据我的研究,我相信包含和regex可以用来做这件事。然而,执行工作没有奏效。我还看到了不同的方法,有些使用"for I in range“,而另一些则在一行代码中使用替换。

代码语言:javascript
复制
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)

这是我尝试做的“我在范围内”的方法,这也是无效的。在这里,我得到了错误"TypeError:'Series‘对象是可变的,因此它们不能被散列“

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-14 17:12:42

IIUC:

代码语言:javascript
复制
shoes_df['brand'] = shoes_df.Product.str.extract(pat='(Nike|Adidas|Asics)',expand=False)

输出:

代码语言:javascript
复制
            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
票数 4
EN

Stack Overflow用户

发布于 2017-11-14 17:11:32

选项1 (艰难的方法)

str.extract

代码语言:javascript
复制
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

代码语言:javascript
复制
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

您可以将其扩展一点,用NaN替换brands中没有的任何内容

代码语言:javascript
复制
df['Brand'] = np.where(df.Brand.isin(brands), df.Brand, np.nan)
票数 4
EN

Stack Overflow用户

发布于 2017-11-14 18:01:09

如果您可以假设品牌始终是第一个词,那么解决方案就可以灵活地捕获已知列表之外的品牌,因此只需添加它就可以了:

代码语言:javascript
复制
shoes_df['Product'].str.extract('^([^\s]+)\s')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47291186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档