我有一个大数据,其中包含有关食品的信息。例如:
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、聚合和某种类型的lambda函数。最终的想法是在我们获得更多的数据时自动化这个过程,而不必依赖于手动更改df.loc代码中的年份。
有什么办法可以做到吗?
发布于 2019-08-18 20:11:59
正如您所猜测的那样,您需要使用带有自定义函数的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是第二列中的值。因为您想要唯一的日志,所以您也需要在'Journal'上分组,并检查'Subscription'之和是否大于零。第二个sum函数将True值的数目求和(True为1,False为0)。journal_author是第三列中的值。对于第二列,逻辑是相同的,但是更复杂一些,因为您需要检查'Subscription'和'Known_author'列在同一行中是否都等于1。pandas.Series是最后数据row的一行。https://stackoverflow.com/questions/57547566
复制相似问题