[英]How to vectorize the intersection of each row and a list and find those that has a non-empty one?
我有一个大数据集,当我运行它时需要很长时间。 一般来说,我发现避免它的唯一方法是我们必须使用 numpy 对其进行矢量化。 或者我可能是错的,你可能有另一种解决方案。 我在数据集方面简化了问题,如下所示。 如果您有一个不错的优雅解决方案,请告诉我?
dfData = pd.DataFrame({'id':[112,14,45,34,78], 'x1':[4,6,1,2,9], 'x2':[1,2,3,4,5], 'x3':[9,3,4,1,2] })
ss = [2,3]
print(dfData)
result = []
ss_set = set(ss)
for i, row in dfData.iterrows():
ll = row.drop('id').tolist()
s_set = set(ll)
if(len(ss_set.intersection(s_set)) > 0):
result.append(row['id'])
print(result)
我认为这应该更快。 如果不是,至少它会更短:
ts = sum([(dfData.set_index('id') == s) for s in ss]).sum(axis=1)>0
ts[ts].index.values
生产
array([14, 45, 34, 78], dtype=int64)
取消选择这个(我建议您分别执行不同的位以了解会发生什么),
(dfData.set_index('id') == s)
返回与dfData
形状相同的 df,其中每个元素为 True 或 False,具体取决于它是否等于 s[(dfData.set_index('id') == s) for s in ss]
s
的每个值创建一个此类 dfs 的列表ss=[2,3]]
sum(...)
将它们逐个元素相加(True 被计算为 1,False 被计算为 0,自然)(...).sum(axis=1)
按行汇总这些值。 如果任何行值 > 0,则该行中存在匹配项ts
是具有 True/False 的时间序列,其中 True 对应于匹配的行ts[ts].index.values
只是拉出对应于 True 的id
(匹配)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.