Skip to main content
 首页 » 编程设计

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

2025年05月04日18pander-it

我使用 Python Pandas 将数据存储为数据框。在这些列中,我有一个“产品”列,其中包含品牌名称和型号(例如 Nike Air Jordan、Adidas Gazelle)。我想创建一个只包含品牌(例如耐克、阿迪达斯)的新列,稍后我将在 groupby 中使用它来汇总数据。 根据我的研究,我相信 contains 和 regex 可以用来做到这一点。但是,实现没有奏效。我也看到了不同的方法,一些使用“for i in range”,而另一些则在一行代码中将其作为替换。

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) 

这是我尝试使用“for i in range”的方法,但也没有用。在这里,我收到错误“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) 

请您参考如下方法:

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