我有一个很大的CSV文件,这是一个呼叫者数据的日志。
我的文件的一小段:
CompanyName High Priority QualityIssue
Customer1 Yes User
Customer1 Yes User
Customer2 No User
Customer3 No Equipment
Customer1 No Neither
Customer3 No User
Customer3 Yes User
Customer3 Yes Equipment
Customer4 No User
我想按照客户出现的频率对整个列表进行排序,这样就像:
CompanyName High Priority QualityIssue
Customer3 No Equipment
Customer3 No User
Customer3 Yes User
Customer3 Yes Equipment
Customer1 Yes User
Customer1 Yes User
Customer1 No Neither
Customer2 No User
Customer4 No User
我试过groupby
,但它只打印出公司名称和频率,而不是其他列,我也试过
df['Totals']= [sum(df['CompanyName'] == df['CompanyName'][i]) for i in xrange(len(df))]
和
df = [sum(df['CompanyName'] == df['CompanyName'][i]) for i in xrange(len(df))]
但这些给予我错误:
ValueError:传入的项数错误1,索引意味着24
我看过这样的东西:
for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
print "%s: %s" % (key, value)
但这只打印出两列,我想对整个CSV进行排序。我的输出应该是按第一列排序的整个CSV。
提前感谢您的帮助!
4条答案
按热度按时间woobm2wo1#
这似乎是你想要的,基本上通过执行
groupby
和transform
与value_counts
来添加一个count列,然后你可以对该列进行排序:输出量:
您可以使用
df.drop
删除无关列:输出量:
wj8zmpe12#
top-voted answer需要一个小的补充:
sort
已被弃用,转而支持sort_values
和sort_index
。sort_values
是这样工作的:cygmwpex3#
更新2021
EdChum和Ilya K.提出的答案不再起作用。
函数
pd.Series.value_counts
返回一个包含唯一值计数的Series。但是,我们应用pd.Series.value_counts
函数的Series本身只包含一个唯一值,因为我们之前将groupby
应用于DataFrame并将CompanyNameSeries拆分为唯一值组。因此,我们应用函数后的最终输出看起来像这样。这是无稽之谈,我们不能将一个系列中的值转换为整个系列。不知何故,我们只需要整数
4
,而不是整个系列。但是,我们可以利用前面的
groupby
函数,计算每个组中的值的数量,将整个组转换为该组中的值的数量,并将它们放在一起形成最终的FrequencySeries。我们可以将
pd.Series.value_counts
替换为pd.Series.count
,或者仅使用函数名count
输出
yshpjwxd4#
我想一定有更好的办法,但这应该行得通:
准备数据:
然后进行转换:
输出:
这可能不是直观的这里发生了什么,但目前我想不出一个更好的方法来做到这一点。我试图尽可能多地发表评论。
这里的棘手部分是
count_df
的索引是客户的(唯一)出现。因此,我将count_df
(left_index=True
)的索引与df
(right_on="CompanyName"
)的CompanyName
列连接起来。这里的神奇之处在于
count_df
已经按照出现的次数进行了排序,这就是为什么我们不需要显式排序。因此,我们所要做的就是将原始 Dataframe 的行按连接 Dataframe 的行重新排序,我们就得到了预期的结果。