我有一个非常大的数据集(10 GB),格式为csv,具有不同的列和行。列之一是某类个人的ID(表示为字符串)。这些ID都已在数据中进行了加密,每个单独的ID可能会出现多次。我想找到数据中最常出现的个人的ID。理想情况下,我想计算每个ID在数据集中出现多少次。最终,我还想对各个ID进行统计分析。什么是最快的方法来做到这一点。我确实尝试过groupby,但不知道如何找到与组相对应的ID及其大小。
import pandas as pd
df = pd.read_csv('file')
user_groups = df.groupby(['IDs'])
答案 0 :(得分:2)
您可以使用value_counts个熊猫。
value_counts :返回包含唯一值计数的对象。生成的对象将按降序排列,以便第一个元素是最频繁出现的元素。默认情况下不包括NA值。
df.ID.value_counts()
也可以像您在问题上所说的那样使用分组方式,更好:当您尝试对频率进行简单计数时:
df.groupby(['ID'], sort=True).size()
有可能看到每种方法的计算成本,并解释了为什么在this answer上禁忌一种方法。但是答案的 TLDR :
m grouper counter
10 62.9 ms 315 ms
10**3 191 ms 535 ms
10**7 514 ms 459 ms
This video显示了如何在熊猫内部进行某些操作,因此,如果您想了解哪种方法使用更多的内存或进行更多的操作,则很有用。
答案 1 :(得分:1)
Widget
答案 2 :(得分:0)
我不确定这是否是您要寻找的答案,但是如果是我,我会考虑从ID中编写一个元组字典,例如{'ID Number':'Count',' 1234ABC':0,...]
然后,我将使用readlines()读取大型数据集的每一行,并且如果该行的数据中出现任何ID,则会更新元组列表中的计数。
完成读取数据集的所有行后,找到 “计数”并返回其关联的ID号。
您甚至可以在列表上进行排序,以将ID编号从出现次数最多到发生的次数排序到最少。
答案 3 :(得分:0)
如果您只是想找到模式,请在这里Most frequent value中回答
如果您想按组细分,请尝试以下操作:
df_2= df.groupby('Ids').count().reset_index()
df_2 = df_2.sort_values('replicate',ascending = False)
您可以将重命名之一添加到“频率”:
df_2 = df_2.rename(columns = {'Column Name':'new name'})