python - Pandas 仅在条件为真时才替换数据框中列的值

标签 python pandas dataframe

我在替换 pandas 数据框中的值时遇到问题。

如果它包含多个字符串,我想在数据框的列(“URL”)中进行搜索。

如果这是真的,我想替换数据框中另一列的值,但在同一行上。 如果在“URL”列的 url 中找到一个字符串,我想将该字符串写在“型号”列的同一行上,并在“品牌”列中写入“三星”

目前,当 contains 的 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')

最佳答案

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

values = ['galaxy-S9', 'note-9', 'galaxy-a6', 'Huawei', 'P20', 'Apple', 'Iphone-X']

接下来您将迭代行,并在这样做的同时更新整个系列每次迭代一行。这是低效的不正确的。一个更好的主意是迭代您的值列表并使用 Pandas bool 索引:

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

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

关于python - Pandas 仅在条件为真时才替换数据框中列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52625091/

相关文章:

python - 使用正则表达式根据列的值在数据集中创建新列

python - 操作系统错误 : [Errno 22] Invalid Argument: '\u202aC:/Users/.../Documents/Python/fish.jpg'

python - 按星期几对 Python DataFrame 进行排序

python - 每个变量的堆栈和返回值计数?

Python 空 csr_matrix 抛出 ValueError : cannot infer dimensions from zero sized index arrays

python - 导入 CSV 并创建临时表来存储结果

python - 如何处理 pandas 数据帧中特定长度序列中的缺失值?

python - 如何使用pymssql将数据帧写入mssql?

python - 从 DataFrame 中的每个值中减去

python - 如何从 python 数据框中检索和存储多个值?