gpt4 book ai didi

python - 如何使用 groupby 和 .loc 顺序过滤数据帧

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:27 25 4
gpt4 key购买 nike

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

     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['订阅']==1)&(df['年份']==2014),'期刊'].agg(['nunique']) .values[0]

(3) df.loc[(df['订阅']==1)&(df['Known_author']==1)&(df['年份']==2014),' Journal'].agg(['nunique']).values[0]

但是,我希望一次性创建该表,我假设使用 groupby、aggregate 和某种 lambda 函数。最终的想法是当我们获取更多数据时自动执行此过程,而不必依赖于手动更改 df.loc 代码中的年份。

有办法做到这一点吗?

最佳答案

正如您所猜测的,您需要将 groupbyapply 与自定义函数一起使用。

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 是第一列中的值。它使用 nunique 计算 'Journal' 列中的唯一值,您已经执行了此步骤。
  • journal_subs 是第二列中的值。由于您想要唯一的期刊,因此您还需要对 'Journal' 进行分组,并检查 'Subscription' 的总和是否大于零。第二个 sum 函数对 True 值的数量进行求和(True 转换为 1,False 转换为 0)。
  • journal_author 是第三列中的值。第二列的逻辑相同,但有点复杂,因为您需要检查 'Subscription''Known_author' 列是否同时等于 1行。
  • 返回的 pandas.Series 是最终数据帧的一行。

关于python - 如何使用 groupby 和 .loc 顺序过滤数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57547566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com