python - 如何对 pandas 中的组进行多次计算并将其写入新的数据帧?
问题描述
请帮我完成以下任务。在我的数据框中,如果提要提供者从另一个复制数据,我会尝试获取信息。放置列表示关于值的供应日期的序列。这意味着 1 是第一个 (GooFeed) 而 2 是第二个 (CyberFeed)。该值可以出现在同一提供程序的多个列表中。这意味着放置本身是不够的,需要列 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),但我无法理解它是如何工作的。就像下一个有多个计算的,如果有人可以帮助我,我会很高兴。哪怕只是小费。
最好的问候莫里斯
解决方案
一种方法是将每个组的第一个位置的名称添加为新列 - 这允许您测试当前源是否是每行的第一个提供者。
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
推荐阅读
- file - 如何在处理中使用 Minim 指定文件的完整路径?
- python - 了解 Word Search 2 Leetode 的 Graph 解决方案
- redis - 在这种情况下,redis lua 脚本会提高读取性能吗?
- r - 将向量中的字符值转换为数值
- html - 如何将图像放入 html/css 中的圆形图标中?
- c++ - 在 C++ 中的有序链表中插入一个新节点
- docker - 使用注册表镜像使用 Sonatype Nexus 代理 docker hub
- r - 遍历存储在向量中的值
- graphql - 如何防止访问 Amplify graphql 公共 API 中的某些字段
- c# - 使用嵌套列表和动态列填充 DataGrid