繁体   English   中英

如何矢量化每一行和一个列表的交集并找到那些非空的?

[英]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)

取消选择这个(我建议您分别执行不同的位以了解会发生什么),

  1. (dfData.set_index('id') == s)返回与dfData形状相同的 df,其中每个元素为 True 或 False,具体取决于它是否等于 s
  2. [(dfData.set_index('id') == s) for s in ss] s的每个值创建一个此类 dfs 的列表ss=[2,3]]
  3. sum(...)将它们逐个元素相加(True 被计算为 1,False 被计算为 0,自然)
  4. 在第 3 步之后,如果任何元素 >0,则 df 中的该元素是 2 或 3(对于我们的示例)
  5. (...).sum(axis=1)按行汇总这些值。 如果任何行值 > 0,则该行中存在匹配项
  6. 最后ts是具有 True/False 的时间序列,其中 True 对应于匹配的行
  7. ts[ts].index.values只是拉出对应于 True 的id (匹配)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM