为了账号安全,请及时绑定邮箱和手机立即绑定

使用 groupby().apply() 而不是在整个数据集上运行循环?

使用 groupby().apply() 而不是在整个数据集上运行循环?

达令说 2022-01-11 17:07:37
我有一个大数据集,如下所示:Year         Company              Sales          Dummy          1993            A                  100             1  1994            A                  50              1 1995            A                  50              1  1996            A                  NaN             01997            A                  NaN             01998            A                  NaN             01993            B                  100             1  1994            B                  50              1 1995            B                  50              1  1996            B                  NaN             01997            B                  NaN             01998            B                  100             1预期的输出如下:Year         Company              Sales          Dummy       1993            A                  100             1            1994            A                  50              1            1995            A                  50              1            1996            A                  NaN             0            1997            A                  NaN             0            1998            A                  NaN             0              我想在 B 公司和 C 公司等公司的虚拟列中填写 1,因为 B 公司在样本期之间存在缺失值,但 B 公司和 C 公司在样本期结束时再次提供销售价值。上面的代码工作正常,可以满足我的需要。但是,我的数据集非常大。上面的代码需要一段时间才能运行。我尝试使用:df.groupby('Company',as_index=False).apply(Newdummygenerator)或者df.groupby('Company',as_index=False).apply(lambda x: Newdummygenerator(x))上面的代码不起作用。并且df.groupby('Company',as_index=False).apply(lambda x: Newdummygenerator(x))Output: __问题:上面代码的输出是__;我想知道为什么会这样。据我了解,apply() 函数将每个组作为一个子数据集,我的函数可以对每个子数据集进行一些操作。我有什么误解吗?如果我想使用定义的函数,如何将定义的函数更改为使用 apply() 函数?有没有更有效的方法来做到这一点?快速分类:我处理的问题比我描述的情况复杂得多。我的观点是为什么我不能在 groupby().apply() 函数中使用上面定义的函数?太感谢了!
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

我知道如何解决这个问题。


我定义的函数应该返回一个新的数据框,因为我按组聚合数据并且在这种情况下需要一个新的数据框。


如果我不放回报,熊猫只会做聚合,因此你的输出将是'__'


*** Create Dummy variables        

    df['Dummy']=np.where(df.Sales.notnull(),1,0)       


*** Def a function 

    def Newdummygenerator(x):

        for i in range(len(x)):

             if x.iloc[i,x.columns.get_loc('Dummy')]==1:

                x.iloc[i,x.columns.get_loc('Dummy')]=1

             elif x.iloc[i,x.columns.get_loc('Dummy')]==0 and\ sum(x.Dummy[i:])>=1 and sum(x.Dummy[0:i])>=1:

                x.iloc[i,x.columns.get_loc('Dummy')]=1

             else: 

                x.iloc[i,x.columns.get_loc('Dummy')]=0

        return x 

上面定义的函数可以插入到 apply() 函数中


df.groupby().apply(Newdummygenerator)


查看完整回答
反对 回复 2022-01-11
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信