Python - 基于列值(或子集)

时间:2016-11-01 15:33:38

标签: python pandas

我正在处理一个拥有300万行和1,200个“群组”的数据集 - 让我们称之为姓氏。

以下是数据集的外观:

LastName    FirstName

Smith       Rachael
Smith       John
Smith       Rachael
Johnson     Bob
Johnson     Laura
Johnson     Laura

我想分别查看每个姓氏,并对每个姓氏中的名字做一些事情。例如,我可能想知道哪个名字在Smith的姓氏中最流行,然后将其添加为自己的列(但实际上它比这复杂得多)。我需要保持所有行完整(换句话说,我需要保留每一个史密斯和每个约翰逊)。

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个数据集。

感谢阅读。

2 个答案:

答案 0 :(得分:1)

要保留返回结果的长度,您可以在transform之后使用groupby,然后将value_counts()函数与index一起使用,以获得每组中最常用的项目:

df['HighestFreq'] = (df.groupby('LastName')['FirstName']
                       .transform(lambda g: g.value_counts().index[0]))
df

enter image description here

答案 1 :(得分:0)

这里只是为了没有Pandas(见下面的Pandas):

按照您要分组的类别对文件进行排序,使用Unix命令或Python脚本,请参阅此处sorting large text data

迭代已排序的文件并获取每个类别所需的指标。由于类别的所有实例现在彼此相邻,您只需将结果保存在内存中。

如果你想跳过排序,你也可以多次迭代文件(但这可能很慢)。您将中间结果保存到磁盘的想法当然会有效。

高级阅读:这基本上是一个map-reduce操作:创建子组分别处理它们然后合并结果。