如果整个字符串包含pandas dataframe中的子字符串,则替换它

时间:2018-02-14 21:33:24

标签: python pandas

我有一个样本数据集。

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>

我怎么能做到这一点?谢谢大家!

6 个答案:

答案 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)