![](/img/trans.png)
[英]Adding a new column to pandas dataframe based on value of existing column
[英]Adding values to new Pandas dataframe column based on partial string contents of existing column
我使用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)
选项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
您可以扩展此范围,以用NaN
替换brands
任何内容:
df['Brand'] = np.where(df.Brand.isin(brands), df.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
如果您可以假设品牌永远是第一位的话,那么该解决方案将使您可以灵活地捕获已知列表之外的品牌,因此只需添加它即可引起兴趣:
shoes_df['Product'].str.extract('^([^\s]+)\s')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.