繁体   English   中英

使用有序列有效地从pandas数据框中选择行

[英]Efficiently selecting rows from pandas dataframe using sorted column

我有一个大型的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.loc[inds]['c6'])
    red[i] = reduce_fun(v1,v2)

然而,我认为这是非常缓慢的,因为它检查整个列的匹配标准(即使在32 mil中可能只有10行是相关的)。 由于big_df按c1排序,而键只是所有唯一c1的列表,有没有快速获取red []数组的方法(即我知道第一行的下一个键是最后一行之后的行)以前的密钥,我知道密钥的最后一行是与密钥匹配的最后一行,因为所有后续行都保证不匹配)。

谢谢,

伊利亚

编辑:我不确定unique()方法的顺序是什么产生的,但我基本上想要为键中的每个键设置一个reduce_fun()的值,我并不特别关心它们的顺序(可能最简单的顺序是命令c1已经排序了)。

Edit2:我稍微重构了代码。 基本上,是否有一种有效的方法来构建inds。 big_df ['c1'] == key占我数据总时间的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语句怎么样? 鉴于DataFrame已经按c1排序,这应该特别有效:

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

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

对我来说似乎很快就会突然显现(对于3000万随机行和一个简单的reduce_fun,约为2秒)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM