在 Python 中使用 AND 条件的 LOC 搜索字符串
LOC search string with AND condition in Python
我正在尝试将 LOC 与 AND 条件一起使用。它在 OR 条件下工作正常,但当列中有重复值时,我无法让它与 AND 一起工作。
def locreplace(df,col,needle,replace,needle2=''):
if (needle2==''):
df.loc[df[col].str.contains(needle, case=False)==True,col] = replace
else:
df.loc[[df[col].str.contains(needle, case=False)==True] and df[col].str.contains(needle2, case=False)==True,col] = replace
没有重复的 table 按预期工作:
#Create a data frame
data = [['granny apple', 'juicy'], ['blood orange', 'refreshing'], ['spanish lemon', 'tangy']]
fruitdf = pd.DataFrame(data, columns = ['fruit', 'taste'])
#Single replace - works
#locreplace(fruitdf,'fruit','apple','big red nice apple')
#Will fail - works
#locreplace(fruitdf,'fruit','apple','big red apple','uncle')
#Double replace - works
locreplace(fruitdf,'fruit','apple','big huge red apple','granny')
但是当您创建一个包含两个“granny”条目的数据框时,双重替换 AND 条件会替换“granny”的两个实例,即使 AND 条件中的“apple”不匹配也是如此。
data = [['granny apple', 'juicy'], ['granny blood orange', 'refreshing'], ['spanish lemon', 'tangy']]
fruitdf = pd.DataFrame(data, columns = ['fruit', 'taste'])
#Single replace - works
#locreplace(fruitdf,'fruit','apple','big red nice apple')
#Will fail - works
#locreplace(fruitdf,'fruit','apple','big red apple','uncle')
#Double replace - fails
locreplace(fruitdf,'fruit','apple','big huge red apple','granny')
毫无疑问是我的错,以及括号的错位(或对代码的误解),但是用 loc(或其他更简单的方法)替换 AND 条件的正确方法是什么?
当前输出:
fruit taste
0 big huge red apple juicy
1 big huge red apple refreshing
2 spanish lemon tangy
期望的输出:
fruit taste
0 big huge red apple juicy
1 granny blood orange refreshing
2 spanish lemon tangy
问题出在 locreplace
的 else
块中
[df[col].str.contains(needle, case=False)==True]
这是一个在第一个索引中有一个系列的列表,而不是一个系列。您需要删除括号并将 and
替换为 &
df.loc[df[col].str.contains(needle, case=False) & df[col].str.contains(needle2, case=False), col] = replace
输出
fruit taste
0 big huge red apple juicy
1 granny blood orange refreshing
2 spanish lemon tangy
我正在尝试将 LOC 与 AND 条件一起使用。它在 OR 条件下工作正常,但当列中有重复值时,我无法让它与 AND 一起工作。
def locreplace(df,col,needle,replace,needle2=''):
if (needle2==''):
df.loc[df[col].str.contains(needle, case=False)==True,col] = replace
else:
df.loc[[df[col].str.contains(needle, case=False)==True] and df[col].str.contains(needle2, case=False)==True,col] = replace
没有重复的 table 按预期工作:
#Create a data frame
data = [['granny apple', 'juicy'], ['blood orange', 'refreshing'], ['spanish lemon', 'tangy']]
fruitdf = pd.DataFrame(data, columns = ['fruit', 'taste'])
#Single replace - works
#locreplace(fruitdf,'fruit','apple','big red nice apple')
#Will fail - works
#locreplace(fruitdf,'fruit','apple','big red apple','uncle')
#Double replace - works
locreplace(fruitdf,'fruit','apple','big huge red apple','granny')
但是当您创建一个包含两个“granny”条目的数据框时,双重替换 AND 条件会替换“granny”的两个实例,即使 AND 条件中的“apple”不匹配也是如此。
data = [['granny apple', 'juicy'], ['granny blood orange', 'refreshing'], ['spanish lemon', 'tangy']]
fruitdf = pd.DataFrame(data, columns = ['fruit', 'taste'])
#Single replace - works
#locreplace(fruitdf,'fruit','apple','big red nice apple')
#Will fail - works
#locreplace(fruitdf,'fruit','apple','big red apple','uncle')
#Double replace - fails
locreplace(fruitdf,'fruit','apple','big huge red apple','granny')
毫无疑问是我的错,以及括号的错位(或对代码的误解),但是用 loc(或其他更简单的方法)替换 AND 条件的正确方法是什么?
当前输出:
fruit taste
0 big huge red apple juicy
1 big huge red apple refreshing
2 spanish lemon tangy
期望的输出:
fruit taste
0 big huge red apple juicy
1 granny blood orange refreshing
2 spanish lemon tangy
问题出在 locreplace
else
块中
[df[col].str.contains(needle, case=False)==True]
这是一个在第一个索引中有一个系列的列表,而不是一个系列。您需要删除括号并将 and
替换为 &
df.loc[df[col].str.contains(needle, case=False) & df[col].str.contains(needle2, case=False), col] = replace
输出
fruit taste
0 big huge red apple juicy
1 granny blood orange refreshing
2 spanish lemon tangy