Python 使用排序列从数据帧中高效地选择行
我有一个包含多列(c1…c8)和~32 mil行的大数据帧。数据帧已按c1排序。我想从共享特定值c1的行中获取其他列值 差不多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.
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'],等等。现在运行计时测试。