我有一个样本数据集。
raw_data = {
'categories': ['sweet beverage', 'salty snacks', 'beverage,sweet', 'fruit juice,beverage,', 'salty crackers'],
'product_name': ['coca-cola', 'salted pistachios', 'fruit juice', 'lemon tea', 'roasted peanuts']}
df_a = pd.DataFrame(raw_data)
我需要通过'类别中的行进行迭代。列,并检查它是否包含特定字符串,在这种情况下,'饮料',之后我会将类别更新为仅饮料'。这个链接是我在stackoverflow上找到的最接近的链接,但并没有告诉我如何通过整个数据集。
Replace whole string if it contains substring in pandas
这是我的示例代码。
for index,row in df.iterrows():
if row.str.contains('beverage', na=False):
df.loc[index,'categories_en'] = 'Beverages'
elif row.str.contains('salty',na=False):
df.loc[index,'categories_en'] = 'Salty Snack'
....<and other conditions>
我怎么能做到这一点?谢谢大家!
答案 0 :(得分:2)
创建以下dicts,然后使用replace
Yourdict2={1:'Beverages',2:'salty'}
Yourdict1={'beverage':1,'salty':2}
df_a.categories.replace(Yourdict1,regex=True).map(Yourdict2)
Out[275]:
0 Beverages
1 salty
2 Beverages
3 Beverages
4 salty
Name: categories, dtype: object
答案 1 :(得分:1)
您可以使用
df_a.loc[df_a.categories.str.contains('beverage'), 'categories'] = 'beverage'
categories product_name
0 beverage coca-cola
1 salty snacks salted pistachios
2 beverage fruit juice
3 beverage lemon tea
4 salty crackers roasted peanuts
答案 2 :(得分:0)
也许你可以尝试这样的事情:
def selector(x):
if 'beverage' in x:
return 'Beverages'
if 'salty' in x:
return 'Salty snack'
df_a['categories_en'] = df_a['categories'].apply(selector)
答案 3 :(得分:0)
使用apply
生成新的categories
列。然后将其分配给数据框的categories_en
列。
def map_categories(cat: str) -> str:
if cat.find("beverage") != -1:
return "beverage"
else:
return str
new_col = df['categories'].apply(map_categories)
df['categories_en'] = new_col
答案 4 :(得分:0)
感谢我提出的各种解决方案。根据您的所有输入,我提出了这个有效的解决方案。
def transformCat(df):
df.loc[df.categories_en.str.lower().str.contains('beers|largers|wines|rotwein|biere',na=False)] = 'Alcoholic,Beverages'
df.loc[df.categories_en.str.lower().str.contains('cheese',na=False)] = 'Dairies,Cheeses'
df.loc[df.categories_en.str.lower().str.contains('yogurts',na=False)] = 'Dairies,Yogurts'
df.loc[df.categories_en.str.lower().str.contains(r'sauce.*ketchup|ketchup.*sauce',na=False)] = 'Sauces,Ketchups'
非常感谢任何投入。谢谢大家!
PS - 我知道应该有一个缩进从df.loc开始,但因为我是stackoverflow的新手(我会学习,我保证),不知怎的,我不能让缩进正确。答案 5 :(得分:0)
使用Python字符串类的__contains__()
方法:
for a in df_a["categories"]:
if a.__contains__("beverage"):
df_a["categories"].replace(a, "beverage", inplace=True)