代码之家  ›  专栏  ›  技术社区  ›  MTT

计算满足某个筛选器的行数

  •  1
  • MTT  · 技术社区  · 6 年前

    我正在处理两个不同的数据帧(常规和最后一个),它们是这样的:

    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 回复  |  直到 6 年前
        1
  •  0
  •   jpp    6 年前

    一种方法是使用 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