【问题标题】:Count how many rows satisfy a certain filter计算有多少行满足某个过滤器
【发布时间】:2018-10-03 07:20:39
【问题描述】:

我正在使用 2 个不同的数据帧(一般和最后一个),它们是这样的:

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

但这需要很长时间...有更简单的想法吗?谢谢!

【问题讨论】:

  • 谢谢@jpp,我已经更新了我的问题!希望你现在能明白!

标签: python pandas dataframe merge pandas-groupby


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 2020-09-17
    • 2020-09-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2020-10-23
    相关资源
    最近更新 更多