簡體   English   中英

僅當條件為true時,熊貓才會替換數據框中的列的值

[英]Pandas replace the value of a column in dataframe only where if condition is true

我在替換熊貓數據框中的值時遇到問題。

我想在數據框的列(“ URL”)中搜索(如果它包含多個字符串)。

如果是這樣,我想替換數據框中但在SAME LINE上另一列的值。 如果在“ URL”列的URL中找到一個字符串,我想將該字符串寫在“ Model”列的同一行上,並在“ Brand”列中寫“ Samsung”

目前,當contains的if條件為true時,它將替換我在其他列上的所有值,而我不希望那樣。

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']

接下來,您要對行進行迭代,同時, 每次迭代row時都要更新整個系列。 這是低效不正確的。 一個更好的主意是迭代值列表並使用Pandas布爾索引:

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

注意,您不需要在已經是字符串的對象上調用str

試試看:

def pair(x):
if str1 in x['URL']:
    x['Model'] = str(str1)
    x['Brand'] = str('Samsung')
if str2 in x['URL']:
    x['Model'] = str(str2)
    x['Brand'] = str('Samsung')
if str3 in x['URL']:
    x['Model'] = str(str3)
    x['Brand'] = str('Samsung')

return x

dataframe_initial.apply(pair, axis = 1)

jpp編寫了一個更有效的解決方案。 這是類似於jpp解決方案的另一種方法:

for value in values:
    df['Model'] = np.where(df['URL'].str.contains(value), value, df['Model'])
df['Brand'] = np.where(df['URL'].str.isin(values), 'Samsung', df['Brand'])

你需要:

dataframe_initial['Model'] = None
dataframe_initial['Brand'] = None


kw = [str1, str2, str3]
for i in kw:
    dataframe_initial['Model'] = np.where(dataframe_initial['URL'].str.contains(i), i, dataframe_initial['Model'] )

dataframe_initial['Brand'] = np.where(dataframe_initial['Model'].isin(kw), 'Samsung', dataframe_initial['Brand'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM