计算满足某一fi的行数

2024-04-16 09:37:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但时间太长了。。。有更简单的主意吗?谢谢


Tags: columnsdataframepandasdatacodelocgenerallast
1条回答
网友
1楼 · 发布于 2024-04-16 09:37:14

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

相关问题 更多 >