熊猫列表和列表列表之间的比较的矢量化

时间:2019-05-10 08:56:50

标签: python pandas dataframe vectorization

我有两个pd.DataFrames classes teacher

classes DataFrame包含变量 classes ['no-pupils'] classes ['teachers'] 。第一个是整数(注册的学生人数),第二个是字符串列表,因为每个班级可以有多位老师。

老师 DataFrame具有(除其他外)两个变量。第一个是与 classes ['teachers'] 列表项相对应的 teachers ['name'] ,第二个是 teachers ['no-pupils '] 我要计算。

我想通过将所有 classes ['teachers] 包含的所有行的 classes ['no-pupils'] 相加来计算此字段> teachers ['name'] 找出老师与多少学生互动。

现在,我通过遍历教师DataFrame的for循环并在该循环内使用以下代码遍历DataFrame类来实现此目的:

for index-teacher, teacher in teachers.iterrows():
    for index-class, class in classes.iterrows():
        if teacher['name'] in class['teachers']:
            teachers['no-pupils'][index-teacher] = teachers['no-pupils'][index1] + classes['no-pupils'][index-class]

由于每个DataFrame大约有2000行,因此这很容易花费5-10分钟。因此,我想知道是否存在使用熊猫强大的矢量化功能的计算效率更高的方法。

P.S .:如果您想知道奇怪的用例,我以为我无法透露真正的用例。

1 个答案:

答案 0 :(得分:0)

您无需检查每个教师的整个数据框,您只需对其进行预处理,并在一次数据框迭代中构造所有教师所需的数据。我建议您使用Python defaultdicts:

from collections import defaultdict

df = pd.DataFrame({
    'teachers': [['A', 'C'], ['C', 'E'], ['A', 'B', 'C'], ['D'], ['B', 'E']],
    'pupils': [1, 2, 3, 4, 5]
})

t_pupils = defaultdict(int)
for i, row in df.iterrows():
    for teacher in row['teachers']:
        t_pupils[teacher] += row['pupils']
t_pupils

返回:

defaultdict(int, {'A': 4, 'B': 8, 'C': 6, 'D': 4, 'E': 7})

这样,您将用线性替换二次复杂度,这将大大提高性能。