首页 > 解决方案 > 如何对 pandas 中的组进行多次计算并将其写入新的数据帧?

问题描述

请帮我完成以下任务。在我的数据框中,如果提要提供者从另一个复制数据,我会尝试获取信息。放置列表示关于值的供应日期的序列。这意味着 1 是第一个 (GooFeed) 而 2 是第二个 (Cyber​​Feed)。该值可以出现在同一提供程序的多个列表中。这意味着放置本身是不够的,需要列 multipleSources。

我拥有的数据框:

价值 资源 放置 多个来源
一个 GooFeed 1 2
一个 网络饲料 2 2
一个 GooFeed 3 2
滥用饲料 1 1
滥用饲料 2 1
C 哇喂 1 3
C GooFeed 2 3
C 网络饲料 3 3

我需要的数据框:

资源 第二 第一提供者
GooFeed 1 [哇喂]
网络饲料 2 [GOODFeed,WOWFeed]

列秒表示提供者有一个不是第一个提供者的提要并且第一个提供者有另一个提供者的每种情况。

我设法获得了所有的第一(groupby,lambda,其中 1 和 sum),但我无法理解它是如何工作的。就像下一个有多个计算的,如果有人可以帮助我,我会很高兴。哪怕只是小费。

最好的问候莫里斯

标签: pythonpandasnumpygroup-byjupyter-notebook

解决方案


一种方法是将每个组的第一个位置的名称添加为新列 - 这允许您测试当前源是否是每行的第一个提供者。

df['firstProvider'] = df.groupby('value').source.transform('first')
df.query('placement != 1 and source != firstProvider')
  value     source  placement  multipleSources firstProvider
1     A  CyberFeed          2                2       GooFeed
6     C    GooFeed          2                3       WOWFeed
7     C  CyberFeed          3                3       WOWFeed

这假设该placement列是“有序的”,因为它占用每个组的第一行 - 如果不是,您可以在分组之前进行排序,例如.sort_values('placement').groupby('value')

要将您的字典放在列中 - 您可以使用collections.Counter

from collections import Counter

seconds = df.query('placement != 1 and source != firstProvider')
seconds = seconds.groupby('source').firstProvider.agg(Counter).reset_index()

>>> seconds
      source                 firstProvider
0  CyberFeed  {'GooFeed': 1, 'WOWFeed': 1}
1    GooFeed                {'WOWFeed': 1}

要获得您的second专栏,您将获得len每个 dict 的。

seconds['second'] = seconds.firstProvider.map(len)

>>> seconds
      source                 firstProvider  second
0  CyberFeed  {'GooFeed': 1, 'WOWFeed': 1}       2
1    GooFeed                {'WOWFeed': 1}       1

推荐阅读