在跟踪当前索引的同时迭代数据框的替代方法

Alternative to iterating dataframe while keeping track of the current index

我正在处理大型数据帧,我注意到使用 df.iterrows() 遍历每个数据帧需要很长时间。目前,我遍历数据框的行,提取数据框中某些行的值,并将它们乘以一些预定义的权重。然后我创建一个置信度,如果它大于某个阈值,我将索引添加到列表 indices。这是我的意思的一个简单示例:

import pandas as pd

attributes = ['attr1', 'attr2', 'attr3']
d = {'attr1': [1, 2], 'attr2': [3, 4], 'attr3' : [5, 6], 'meta': ['foo', 'bar']}
df = pd.DataFrame(data=d)

indices = []
threshold = 0.5
for index, row in df.iterrows():
  weights = [0.3 , 0.3, 0.4]
  results = []
  for attr in attributes:
    if attr == 'attr1':
      results.append(row[attr] * 5)
    else:
      results.append(row[attr])
  confidence_level = sum(list(map(lambda x, y: x * y, results, weights))) / len(results)
  if confidence_level >= threshold:
    indices.append(index)

我的问题是是否有办法摆脱第一个循环,同时仍然跟踪数据帧中的索引?如果可能的话,内部循环应该保持原样,因为它包含一个条件。

这是完全可向量化的:

weighted_attrs = df[attributes] * weights / len(weights)
# honestly, it'd be more logical to adjust weights instead
weighted_attrs['attr1'] *= 5
confidence_levels = weighted_attrs.sum(axis=1)
indices = df.index[confidence_levels > threshold]

迭代熊猫数据帧确实很慢,应该避免。您可以使用 df.apply() 为每一行应用一个函数。如果您这样做是为了获得每行的置信度并且 select 只有置信度高于阈值的行,您应该得到您想要的。