python - Python 过滤错误。布尔系列键将被重新索引以匹配 DataFrame 索引。
问题描述
我正在努力让我编写的这段代码工作。我知道这可能很容易解决,但我似乎无法让它正常工作。本质上,我想要的是在 pandas 数据帧上创建一个布尔掩码,它只返回“PqaQuestion”中存在“实际制造商”或“实际集合”中的值的行。它适用于一组标准,但添加多个标准会使事情变得有点混乱。如果不触发用户警告,我似乎无法在其中获得“或”运算符:布尔系列键将被重新索引以匹配数据帧索引,这确实会弄乱输出。如果有人可以帮助解决此问题,但也可以帮助我理解为什么会发生这种情况,我将不胜感激。我看过关于这个主题的其他帖子,但没有一个可以解释它,我可以'
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()
解决方案
您没有准确解释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
将您的前 3 个条件组合成一个 viapd.DataFrame.all
。- Pandas 系列和 NumPy 数组中的布尔条件可以通过
&
/|
运算符组合。
推荐阅读
- python - 使用 Psycopg2 在 Postgres 数据库中从一个表批量插入/更新到另一个表
- c# - 如何修复阻止显示/隐藏菜单的代码?
- python - 这对于使用 Tensorflow 对象检测 API 训练的机器学习模型是否正常?
- amazon-web-services - AWS 角色与密钥
- python - 我可以在 Python 中标记 SQL 字符串吗?
- julia - 如何使 Julia PkgServer.jl 脱机工作
- macos - MacOS分布式通知在后台应用程序Swift上丢失
- angular - 在所有可观察对象完成后订阅最终可观察对象?
- c - 在 UP 模式和 OUTMOD_7 信号中使用 TimerA 生成 3 个频率为 2 kHz 且占空比为 P1.4 10% 和 P1.3 30% 和 P1.2 60% 的 PWM 信号
- ios - Alamofire 请求失败,响应为零