我在替换熊猫数据框中的值时遇到问题。
我想在数据框的列(“ 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')
答案 0 :(得分:5)
首先,您应该避免创建数量可变的变量。您可以改用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
。
答案 1 :(得分:1)
尝试一下:
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'])
答案 2 :(得分:1)
您需要:
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'])