首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用groupby和.loc对数据进行顺序过滤

如何使用groupby和.loc对数据进行顺序过滤
EN

Stack Overflow用户
提问于 2019-08-18 19:05:55
回答 1查看 3.5K关注 0票数 1

我有一个大数据,其中包含有关食品的信息。例如:

代码语言:javascript
复制
     Year    Journal    Subscription    Known_author
0    2014       A            1               1
1    2014       A            1               0 
2    2014       B            0               1
3    2014       C            1               0
4    2015       A            1               1
5    2015       B            1               1
6    2015       C            0               1
7    2015       D            0               0

我希望能够按年分组并创建一个表,其中包含(1)每年唯一的期刊数量,(2)有订阅的唯一期刊的数量,以及(3)有订阅和已知作者的唯一期刊的数量。

这将是我在这个场景中寻找的表:

代码语言:javascript
复制
Year   (1) Column         (2) Column      (3) Column
2014       3                   2               1
2015       4                   2               2 

我用过:

(1)第一列的df.groupby('Pub_Date_Year')['Journal'].agg('nunique')

(2) df.loc[(df['Subscription']==1)&(df['Year']==2014),'Journal'].agg(['nunique']).values[0]

(3) df.loc[(df['Subscription']==1)&(df['Known_author']==1)&(df['Year']==2014),'Journal'].agg(['nunique']).values[0]

但是,我想要一次创建这个表,我假设使用groupby、聚合和某种类型的lambda函数。最终的想法是在我们获得更多的数据时自动化这个过程,而不必依赖于手动更改df.loc代码中的年份。

有什么办法可以做到吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-18 20:11:59

正如您所猜测的那样,您需要使用带有自定义函数的groupby + apply

代码语言:javascript
复制
def grouping(x):
    journal_uniq = x['Journal'].nunique()
    journal_subs = x.groupby('Journal').apply(lambda d : d['Subscription'].sum() > 0).sum()
    journal_author = x.groupby('Journal').apply(lambda d : ((((d['Subscription'] == 1) & (d['Known_author'] == 1)).sum()) > 0)).sum()
    return pd.Series([journal_uniq, journal_subs, journal_author])

ddf = df.groupby('Year').apply(grouping)

使用示例输入,这将返回:

代码语言:javascript
复制
      0  1  2
Year         
2014  3  2  1
2015  4  2  2

关于这一职能的更多细节:

  • journal_uniq是第一列中的值。它使用'Journal'计算列nunique中的唯一值,您已经执行了这个步骤。
  • journal_subs是第二列中的值。因为您想要唯一的日志,所以您也需要在'Journal'上分组,并检查'Subscription'之和是否大于零。第二个sum函数将True值的数目求和(True为1,False为0)。
  • journal_author是第三列中的值。对于第二列,逻辑是相同的,但是更复杂一些,因为您需要检查'Subscription''Known_author'列在同一行中是否都等于1。
  • 返回的pandas.Series是最后数据row的一行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57547566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档