Панды заменяют значение столбца в кадре данных только в том случае, если условие истинно - PullRequest
0 голосов
/ 03 октября 2018

У меня проблема с заменой значений в кадре данных pandas.

Я хочу выполнить поиск в столбце ('URL') информационного кадра, если он содержит несколько строк.

Если это так, я хочу заменить значение другого столбца в кадре данных, но в ЖЕ ЛИНИИ.Если в URL-адресе из столбца «URL» найдена строка, я хочу написать эту строку в той же строке в столбце «Модель» и написать «Samsung», например, в столбце «Бренд»

На данный момент, когда условие 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')

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Во-первых, вам следует избегать создания переменного числа переменных.Вместо этого вы можете использовать list:

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

Затем вы выполняете итерацию строк и, при этом, обновляете всю серию каждый раз, когда выполняете итерацию строки .Это неэффективно и неверно.Лучшая идея - итерировать ваш список значений и использовать логическое индексирование Pandas:

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

Обратите внимание, что вам не нужно вызывать str для объектов, которые уже являются строками.

0 голосов
/ 03 октября 2018

Вам нужно:

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'])
0 голосов
/ 03 октября 2018

Попробуйте:

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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...