dataFrame使用pandas groupby方法进行键控

时间:2013-06-26 13:53:10

标签: group-by pandas

我是熊猫新手,并试图学习如何使用它。我试图使用我在其中一个wes视频和笔记本中看到的数据时遇到问题。我有一个csv文件,如下所示:

filePath,vp,score
E:\Audio\7168965711_5601_4.wav,Cust_9709495726,-2
E:\Audio\7168965711_5601_4.wav,Cust_9708568031,-80
E:\Audio\7168965711_5601_4.wav,Cust_9702445777,-2
E:\Audio\7168965711_5601_4.wav,Cust_7023544759,-35
E:\Audio\7168965711_5601_4.wav,Cust_9702229339,-77
E:\Audio\7168965711_5601_4.wav,Cust_9513243289,25
E:\Audio\7168965711_5601_4.wav,Cust_2102513187,18
E:\Audio\7168965711_5601_4.wav,Cust_6625625104,-56
E:\Audio\7168965711_5601_4.wav,Cust_6073165338,-40
E:\Audio\7168965711_5601_4.wav,Cust_5105831247,-30
E:\Audio\7168965711_5601_4.wav,Cust_9513082770,-55
E:\Audio\7168965711_5601_4.wav,Cust_5753907026,-79
E:\Audio\7168965711_5601_4.wav,Cust_7403410322,11
E:\Audio\7168965711_5601_4.wav,Cust_4062144116,-70

我将它加载到一个数据框,并将其加载到“filePath”和“vp”,代码为:

res = df.groupby(['filePath','vp']).size()    
res.index

,输出为:

[E:\Audio\7168965711_5601_4.wav                  Cust_2102513187,
Cust_4062144116,                                 Cust_5105831247,
Cust_5753907026,                                 Cust_6073165338,
Cust_6625625104,                                 Cust_7023544759,
Cust_7403410322,                                 Cust_9513082770,
Cust_9513243289,                                 Cust_9702229339,
Cust_9702445777,                                 Cust_9708568031,
Cust_9709495726]

现在我试图像dict那样接近索引,正如我在示例中看到的那样,但是当我在做

res['Cust_4062144116']

我收到错误:

KeyError: 'Cust_4062144116'

当我把文件路径放入时,我确实成功得到了一个结果,但正如我所理解并在前面的例子中看到的那样我也应该能够使用vp键,不是这样吗?

很抱歉,如果它是一个微不足道的,我只是无法理解为什么它在一个例子而不是在另一个例子。

2 个答案:

答案 0 :(得分:1)

Rutger你不对。可以对multiIndex系列进行“部分”索引。我只是以错误的方式做到了。

索引第一级是文件名(例如上面的E:\ Audio \ 7168965711_5601_4.wav),第二级是vp。意思是,对于每个文件名,我有多个vps。 现在,这是正确的:

res['E:\Audio\7168965711_5601_4.wav]

并将返回: Cust_2102513187 2 Cust_4062144116 8 ....

但尝试使用内部索引(Cust_索引)进行索引将失败。

答案 1 :(得分:0)

您可以分组两列,因此获得MultiIndex。这意味着您还必须使用这些列进行切片,而不是使用单个索引值。

groupby对象上的.size()会将其转换为系列。如果您在DataFrame中强制它,您可以使用.xs方法切片单个级别:

res = pd.DataFrame(df.groupby(['filePath','vp']).size())
res.xs('Cust_4062144116', level=1)

有效。如果你想把它保存为一个系列,布尔索引可以提供帮助,例如:

res[res.index.get_level_values(1) == 'Cust_4062144116']

最后一个选项的可读性稍差,但有时也更灵活,您可以一次测试多个值,例如:

res[res.index.get_level_values(1).isin(['Cust_4062144116', 'Cust_6073165338'])]