Python - 基于列值(或子集)的分组(或循环)
Posted
技术标签:
【中文标题】Python - 基于列值(或子集)的分组(或循环)【英文标题】:Python - Grouping (or looping) based on column value (or subsetting) 【发布时间】:2016-11-01 15:33:38 【问题描述】:我正在处理一个包含 300 万行和 1,200 个“组”的数据集 - 我们称它们为姓氏。
数据集如下所示:
LastName FirstName
Smith Rachael
Smith John
Smith Rachael
Johnson Bob
Johnson Laura
Johnson Laura
我想分别查看每个姓氏,并对每个姓氏中的名字做一些事情。例如,我可能想找出在 Smith 的姓氏中哪个名字最普遍,然后将其添加为自己的列(但实际上它比这复杂得多)。我需要保持所有行的完整性(换句话说,我需要保持每个 Smith 和每个 Johnson)。
LastName FirstName HighestFreq
Smith Rachael Rachael
Smith John Rachael
Smith Rachael Rachael
Johnson Bob Laura
Johnson Laura Laura
Johnson Laura Laura
我不知道最好的方法是将数据集拆分为 1,200 个数据集,然后在最后重新合并或执行某种循环。我对 Python 很陌生,无法弄清楚如何正确地做到这一点。我已经找到了查看各个行所需的代码,现在如何一次只查看一个姓氏。
另外,如果子集是最好的方法,我需要循环命名集合,因为我显然不会手动命名 1,200 个数据集。
感谢阅读。
【问题讨论】:
我认为您不需要创建 1,200 个数据集,但为什么不需要。按感兴趣的类别对原始数据集进行排序始终是一个好的开始(如果您的数据集太大而无法保存在内存中,这可能并非易事)。排序后,您很可能会在变量中保存一个类别的所有计数。 【参考方案1】:为了保持返回结果的长度,你可以在groupby
之后使用transform
,然后使用value_counts()
函数和index
来获取每个组中出现频率最高的项目:
df['HighestFreq'] = (df.groupby('LastName')['FirstName']
.transform(lambda g: g.value_counts().index[0]))
df
【讨论】:
你应该提到这个解决方案是基于 NumPy 和 NumPy 可能不可用,因为它需要一些系统依赖。但是,使用可以为您解决底层内存管理问题的东西似乎是个好主意。我一直在考虑 sqlite,但一直在想“纯”Python 中的最佳解决方案是什么。 我对 Pandas 库的底层了解不多,这个解决方案使用了 pandas。我相信如果 pandas 依赖于 Numpy,你应该在安装 pandas 的同时安装它? 抱歉,我没有看到问题上的 Pandas 标签。 感谢大家的帮助 我对此有一个后续问题。有谁知道如果出现平局会发生什么?假设 Rachael 是名字 3 次,Linda 是名字 3 次。发生什么了?我可以告诉它选择哪个作为“最频繁”吗?【参考方案2】:这里是为了以防万一没有 Pandas(参见下面的 Pandas):
使用 Unix 命令或 Python 脚本按您要分组的类别对文件进行排序,请参阅此处sorting large text data。
比遍历排序的文件并获取每个类别所需的指标。由于一个类别的所有实例现在都彼此相邻,因此您只需将结果保存在内存中。
如果您想跳过排序,您还可以对文件进行多次迭代(但这可能会很慢)。您将中间结果保存到磁盘的想法当然会奏效。
进阶阅读:这基本上是一个 map-reduce-operation:创建子组分别处理它们,然后合并结果。
【讨论】:
以上是关于Python - 基于列值(或子集)的分组(或循环)的主要内容,如果未能解决你的问题,请参考以下文章
R - 子集 - 基于列值的 grepl 选择排除行 [重复]
python pandas groupby分组后的数据怎么用