2017-08-08 71 views
1

我有一个大型熊猫数据框,具有多个列(c1 ... c8)和〜32 mil行。数据框已经按c1排序。我想从共享c1的特定值的行中获取其他列值。使用排序列从熊猫数据框中有效选择行

keys = big_df['c1'].unique() 
red = np.zeros(len(keys)) 
for i, key in enumerate(keys): 
    inds = (big_df['c1'] == key) 
    v1 = np.array(big_df.loc[inds]['c2']) 
    v2 = np.array(big_df.loc[inds]['c6']) 
    red[i] = reduce_fun(v1,v2) 

然而,这原来是很慢的,我认为是因为它会检查所有列的匹配准则(即使有可能只有10行了32万的是相关) 。由于big_df是按c1排序的,键只是所有唯一c1的列表,是否有一种快速的方式来获取红色[]数组(即我知道第一行,下一个键是最后一行之后的行前一个键,我知道键的最后一行是与键匹配的最后一行,因为所有后续行都保证不匹配)。

感谢,

伊利亚

编辑:我不知道什么样的顺序是唯一的()方法产生,但我基本上是想为在按键的每个键reduce_fun(),我不”的价值特别注意它们是什么顺序(推测最简单的顺序是顺序c1已经排序)。

Edit2:我稍微重构了代码。基本上,有没有一种有效的构建工程的方法。 big_df ['c1'] ==键占据我数据总时间的75.8%,而根据线剖析器创建v1,v2占21.6%。

+0

大熊猫不提供索引行访问数据库中该术语的含义。顺序访问是唯一的选择,我担心 - 除非您将数据框转换为数组或列表并自行搜索。但是,转换操作将花费与原始选择本身一样多的时间。 – DyZ

回答

4

而不是一个列表,我选择了一个字典来保存在c1中的每个项目上键入的缩小值。

red = {key: reduce_func(frame['c2'].values, frame['c7'].values) 
     for key, frame in df.groupby('c1')} 
+2

这比我的代码快250倍。谢谢! – Ilya

2

如何在列表理解一个groupby声明?这应该给予DataFrame已经被c1排序是特别有效:

编辑:忘记了groupby返回一个元组。哎呀!

red = [reduce_fun(g['c2'].values, g['c6'].values) for i, g in big_df.groupby('c1', sort=False)] 

似乎突然间对我来说(约30万随机行~2秒和一个简单的reduce_fun)。

+0

这似乎适用于df.groupby返回一个元组(key,df)所以它必须是g [1] ['c2']等的小修正。现在运行时序测试。 – Ilya

+0

糟糕!感谢您指出这一点,@Ilya! – PaSTE