如何使用groupby和.loc按顺序筛选数据帧

2024-05-13 06:16:36 发布

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

我有一个包含食物信息的大数据框。例如:

     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)订阅的唯一期刊数量和已知作者。你知道吗

这就是我在这个场景中要查找的表:

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、aggregate和某种lambda函数。最终的想法是当我们获得更多的数据时,自动化这个过程,而不必依靠手动改变未来的年份测向位置代码。你知道吗

有办法吗?你知道吗


Tags: 数据df数量columnyearlocaggsubscription
1条回答
网友
1楼 · 发布于 2024-05-13 06:16:36

正如您所猜测的,您需要对自定义函数使用groupby加上apply。你知道吗

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)

使用示例输入,将返回:

      0  1  2
Year         
2014  3  2  1
2015  4  2  2

有关函数的更多详细信息:

  • journal_uniq是第一列中的值。它统计列'Journal'中的唯一值使用nunique,您已经完成了此步骤。你知道吗
  • journal_subs是第2列中的值。因为您需要唯一的日志,所以还需要对'Journal'进行分组,并检查'Subscription'的和是否大于零。第二个sum函数对True值的数目求和(True转换为1,False转换为0)。你知道吗
  • journal_author是第3列中的值。第二列的逻辑是相同的,但要复杂一些,因为您需要检查同一行的'Subscription''Known_author'列是否都等于1。你知道吗
  • 返回的pandas.Series是最终数据帧的一行。你知道吗

相关问题 更多 >