我正在努力获取编写的代码以供使用。我知道这可能很容易解决,但似乎无法正常工作。本质上,我想要在pandas数据框上创建一个布尔掩码,该布尔掩码仅返回“ PqaQuestion”中“ Actual Manufacturer”或“ Actual Collection”中存在值的行。它适用于一组条件,但添加多个条件会使事情有些混乱。我似乎无法在不触发用户警告的情况下获得“或”运算符:布尔系列键将被重新索引以匹配数据帧索引,这会弄乱输出。如果有人可以帮助解决此问题,但也可以帮助我理解为什么会发生这种情况,我将不胜感激。我看过其他有关该主题的帖子,但没有任何一篇对此进行解释,而且我似乎无法根据自己的情况定制其他帖子。
names= ['PqaPrSKU', 'PrName', 'White Label Manufacturer', 'White Label Collection', 'Actual Manufacturer', 'Actual MaID', 'Actual Collection', 'PqaID', 'PqaQuestion', 'UpdatedQuestion', 'PanID', 'PanAnswer', 'UpdatedAnswer', 'DateAdded', 'PrBclgID']
def match_function(column1_value, column2_value, column3_value):
return (column2_value is not None) and (column1_value is not None) and (column3_value is not None) and (str(column2_value).lower() in str(column1_value).lower()) or (str(column3_value).lower() in str(column1_value).lower())
import pandas as pd
df = pd.read_csv('Bucket61(8.22).csv', names= names, skipinitialspace=True, skiprows=1)
#print(df.from_records(data))
indexer = df.apply(lambda row: match_function(row["PqaQuestion"], row["Actual Collection"], row["Actual Manufacturer"]), axis=1)
filtered_df = df[indexer]
print(filtered_df[indexer])
#print(df[indexer])
from pandas import ExcelWriter
writer = ExcelWriter('ScrubbedQATemplate.xlsx')
filtered_df.to_excel(writer, 'Sheet1')
writer.save()
答案 0 :(得分:0)
您尚未确切说明match_function
试图达到的目标,但是应尽可能避免使用pd.DataFrame.apply
。只不过是一个薄薄的循环。
让我们尝试将match_function
中的条件转换为布尔系列掩码:
def match_function(column1_value, column2_value, column3_value):
return (column2_value is not None) and (column1_value is not None) and \
(column3_value is not None) and \
(str(column2_value).lower() in str(column1_value).lower()) or \
(str(column3_value).lower() in str(column1_value).lower())
# match_function(row["PqaQuestion"], row["Actual Collection"], row["Actual Manufacturer"])
这是一个尝试:
cols = ['PqaQuestion', 'Actual Collection', 'Actual Manufacturer']
A = df[cols].astype(str).values
m1 = df[cols].notnull().all(1)
m2 = np.array([j.lower() in i.lower() for i, j, k in A])
m3 = np.array([k.lower() in i.lower() for i, j, k in A])
filtered_df = df[m1 & (m2 | m3)]
需要注意的几点:
&
/ |
使用矢量化运算,而不是将标量运算and
/ or
用于逐行运算。m1
通过pd.DataFrame.all
将您的前三个条件组合成一个条件。&
/ |
运算符进行组合。