我正在处理两个不同的数据帧(一般和最后一个),如下所示:
general=pandas.DataFrame(columns=["code","grade","year","quarter","subject"],data=[[01,4.5,2011,1,1],[01,5.0,2012,2,1],[23,5.0,2013,1,2],[01,7.5,2011,1,2])
last=pandas.DataFrame(columns=["code","grade","subject"],data=[[01,5.0,1],[01,7.5,2],[23,5.0,2])
我想在“last”中添加一个名为“attempts”的列,其中我获得了学生通过该主题所尝试的次数。(基本上,添加一列符合特定条件的行数)。 我试过用这个:
last["ATTEMPTS"]=None
for ind in general.index:
st=general.loc[ind]["code"]
subject=general.loc[ind]["subject"]
fil1=grades["code"]==st
fil2=grades["subject"]==subject
attempts=len(general[fil1&fil2])
last.at[ind, "ATTEMPTS"] = attempts
但这需要太长时间......任何更简单的想法?谢谢!
答案 0 :(得分:0)
一种方法是使用groupby.size()
,然后对齐索引以映射结果。
为了提高性能,您应避免在pandas
数据帧中迭代行,以支持向量化计算。
<强>设置强>
我稍微更改了数据以使其成为更有趣的示例,并修复了语法错误。
general = pd.DataFrame(columns=["code","grade","year","quarter","subject"],data=[[1,4.5,2011,1,1],[1,5.0,2012,2,1],[23,5.0,2013,1,2],[1,7.5,2011,1,2]])
last = pd.DataFrame(columns=["code","grade","subject"],data=[[1,5.0,1],[1,7.5,2],[23,5.0,2], [1, 6.0, 1]])
<强>解决方案强>
s = last.groupby(['code', 'subject']).size()
general['ATTEMPTS'] = general.set_index(['code', 'subject']).index.map(s.get)
<强>结果强>
print(general)
code grade year quarter subject ATTEMPTS
0 1 4.5 2011 1 1 2
1 1 5.0 2012 2 1 2
2 23 5.0 2013 1 2 1
3 1 7.5 2011 1 2 1