我有两个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 .:如果您想知道奇怪的用例,我以为我无法透露真正的用例。
答案 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})
这样,您将用线性替换二次复杂度,这将大大提高性能。