仅当条件为真时,Pandas才会替换数据框中列的值

PyR*_*Rar 1 python dataframe pandas

我在替换pandas数据帧中的值时遇到问题.

我想在数据框的列('URL')中搜索它是否包含多个字符串.

如果这是真的,我想替换数据帧中的另一列的值,但是在相同的行上.如果在"URL"列的网址中找到字符串,我想在"模型"列中的同一行写入该字符串,并在"品牌"列上写"三星"

目前,当包含的if条件为真时,它会替换其他列上的所有值,而我不希望这样.

Python代码:

import pandas as pd

dataframe_initial = pd.DataFrame()
dataframe_initial = pd.read_excel('tele2.xlsx')
dataframe_initial['Model'] = ""
dataframe_initial['Brand'] = ""

str1 = 'galaxy-S9'
str2 = 'note-9'
str3 = 'galaxy-a6'
str4 = 'Huawei'
str5 = 'P20'
str6 = 'Apple'
str7 = 'Iphone-X'

for url in dataframe_initial['URL']:
    if str1 in url:
        dataframe_initial['Model'] = str(str1)
        dataframe_initial['Brand'] = str('Samsung')
    if str3 in url:
        dataframe_initial['Model'] = str(str3)
        dataframe_initial['Brand'] = str('Samsung')
    if str2 in url:
        dataframe_initial['Model'] = str(str2)
        dataframe_initial['Brand'] = str('Samsung')
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 5

首先,您应该避免创建可变数量的变量.你可以list改用:

values = ['galaxy-S9', 'note-9', 'galaxy-a6', 'Huawei', 'P20', 'Apple', 'Iphone-X']
Run Code Online (Sandbox Code Playgroud)

接下来,您将迭代行,并在执行此操作时,每次迭代行时更新整个系列.这是低效不正确.更好的想法是迭代您的值列表并使用Pandas布尔索引:

for value in values:
    mask = df['URL'].str.contains(value, regex=False)
    df.loc[mask, 'Model'] = value
    df.loc[mask, 'Brand'] = 'Samsung'
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要调用str已经是字符串的对象.