2016-08-18 61 views
1

下面是我的任务的一个非常简短的描述。我有一个像这样的数据框:df = pd.DataFrame([[2, 0], [2, 1], [1, 0], [1, 0], [1, 1], [3, 0]], columns=['topic', 'strange'])熊猫计算话题的奇怪性

对于每个主题,我需要caclulate'奇怪'的行的百分比。所以结果会是这样的1 - 1/3, 2 - 1/2, 3 - 0

最有效的解决方案,我想出了是:

a = df['topic'].value_counts() 
b = df[df['strange'] == 1]['topic'].value_counts() 
res = (b/a).fillna(0) 

而且这很可能是合理的高性能并不算难看,我相信这可以用智能GROUPBY操作来实现更简单。

有没有人有其他建议?寻找更短或更快的选择。

回答

2

如果strange保证是0或1只,你可以只取均值:

In [7]: df.groupby("topic").mean() 
Out[7]: 
     strange 
topic 
1  0.333333 
2  0.500000 
3  0.000000 
+0

其实怪是一个布尔值。所以这是有保证的。这显然比我的要短,而且对于我的10毫秒行数据帧,有20万个奇怪的元素,你的解决方案只需要更少的时间:** 3.22秒** ** ** 2.97 ** –