Python 使用排序列从数据帧中高效地选择行

Python 使用排序列从数据帧中高效地选择行,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个包含多列(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.

我有一个包含多列(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)
然而,我认为这是非常慢的,因为它检查了整个列的匹配条件(即使在32mil中可能只有10行是相关的)。由于big_df是按c1排序的,键只是所有唯一c1的列表,因此有没有一种快速的方法来获取红色[]数组(即我知道具有下一个键的第一行是前一个键的最后一行之后的行,我知道键的最后一行是与该键匹配的最后一行,因为所有后续行都保证不匹配)

谢谢

伊利亚

编辑:我不确定order unique()方法生成的是什么,但我基本上希望键中的每个键都有一个reduce_fun()值,我并不特别关心它们的顺序(大概最简单的顺序是c1已经排序的顺序)


Edit2:我稍微重组了代码。基本上,是否有一种构建IND的有效方法。big_df['c1']==键在我的数据中占总时间的75.8%,而根据line profiler,创建v1、v2需要21.6%。

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

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

列表中的
groupby
语句怎么样?考虑到
数据帧
已按
c1
排序,这应该特别有效:

Edit:忘记了
groupby
返回元组。哎呀

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

对我来说,似乎过得很快(对于3000万个随机行,大约需要2秒时间,这只是一个小小的减少乐趣)。

Pandas在这个术语的数据库含义中不提供索引行访问。顺序访问恐怕是唯一的选择——除非您将数据帧转换为数组或列表列表并自己搜索。但是,转换操作将花费与原始选择本身一样多的时间。这似乎与df.groupby返回一个元组(key,df)的轻微更正有关,因此它必须是g[1]['c2'],等等。现在运行计时测试。