计算满足某个过滤器的行数

时间:2018-04-23 09:37:47

标签: python pandas dataframe merge pandas-groupby

我正在处理两个不同的数据帧(一般和最后一个),如下所示:

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

但这需要太长时间......任何更简单的想法?谢谢!

1 个答案:

答案 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