首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只在条件为真的情况下才替换dataframe中列的值。

只在条件为真的情况下才替换dataframe中列的值。
EN

Stack Overflow用户
提问于 2018-10-03 10:32:06
回答 3查看 800关注 0票数 1

我有一个问题,在一个熊猫数据替换价值观。

如果数据文件包含多个字符串,我希望在它的列('URL')中搜索。

如果这是真的,我希望替换dataframe中的另一列的值,但替换同一行的值。如果在“url”列的URL中找到一个字符串,我希望在列“Model”中的同一行上写入该字符串,并在“品牌”列中写入“Samsung”。

目前,当包含的if条件为true时,它将替换我在其他列上的所有值,我不想这样做。

Python代码:

代码语言:javascript
复制
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')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-03 10:43:42

首先,您应该避免创建变量数。您可以使用list代替:

代码语言:javascript
复制
values = ['galaxy-S9', 'note-9', 'galaxy-a6', 'Huawei', 'P20', 'Apple', 'Iphone-X']

接下来,您将迭代行,并在此过程中每次迭代一行时更新整个系列。这是低效和不正确的。更好的方法是迭代值列表并使用Pandas布尔索引:

代码语言:javascript
复制
for value in values:
    mask = df['URL'].str.contains(value, regex=False)
    df.loc[mask, 'Model'] = value
    df.loc[mask, 'Brand'] = 'Samsung'

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

票数 5
EN

Stack Overflow用户

发布于 2018-10-03 10:43:12

试试看:

代码语言:javascript
复制
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解决方案的方法:

代码语言:javascript
复制
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'])
票数 1
EN

Stack Overflow用户

发布于 2018-10-03 10:46:03

你需要:

代码语言:javascript
复制
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'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52625091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档