熊猫=>按组获取第一个和最后一个元素的索引

亚历山大·戴维

我有一个大约有1亿行的数据帧(内存为1.4Gb)

给定输入:

df.head()

Out[1]:
     id    term     x
0     1     A       3
1     1     B       2
2     2     A       1
3     2     B       1
4     2     F       1
5     2     G       1
6     2     Z       1
7     3     K       1
8     3     M       1
9     3     N       1
10    3     Q       1
11    3     R       1
12    3     Z       1
13    4     F       1

我想为每个ID检索第一行的索引。例:

Out[1]:
     id    first_idx
0     1    0       
1     2    2       
2     3    7      
2     4    13

我当前的方法非常慢:

first_row = {}
last_id = None
first_row = None

#iterate over all rows
for idx,r in bow.iterrows():
    cid = r['id']
    if cid != last_id: #is this an ID we haven't seen before?
        first_row[cid] = idx
        last_id = cid

任何建议都会有很大帮助。

迪卡卡

一,一般情况

方法#1使用np.unique-

idx = np.unique(df.id.values, return_index=1)[1]

要获取每个的最后一个索引ID,只需使用flippedversion并从数据帧的长度中减去-

len(df)-np.unique(df.id.values[::-1], return_index=1)[1]-1

二。对于idcol已经被排序

方法#2-A我们可以使用slicing显着的性能提升,因为我们会避免排序-

a = df.id.values
idx = np.concatenate(([0],np.flatnonzero(a[1:] != a[:-1])+1))

方法#2-B使用masking(最好使用大量ID号)

a = df.id.values
mask = np.concatenate(([True],a[1:] != a[:-1]))
idx = np.flatnonzero(mask)

对于最后一个索引:

np.flatnonzero(np.concatenate((a[1:] != a[:-1],[True])))

方法#3对于序号,我们可以使用np.bincount-

a = df.id.values
idx = np.bincount(a).cumsum()[:-1]

样品运行-

In [334]: df
Out[334]: 
    id term  x
0    1    A  3
1    1    B  2
2    2    A  1
3    2    B  1
4    2    F  1
5    2    G  1
6    2    Z  1
7    3    K  1
8    3    M  1
9    3    N  1
10   3    Q  1
11   3    R  1
12   3    Z  1
13   4    F  1

In [335]: idx = np.unique(df.id.values, return_index=1)[1]

In [336]: idx
Out[336]: array([ 0,  2,  7, 13])

如果您需要在数据框中输出-

In [337]: a = df.id.values

In [338]: pd.DataFrame(np.column_stack((a[idx], idx)), columns=[['id','first_idx']])
Out[338]: 
   id  first_idx
0   1          0
1   2          2
2   3          7
3   4         13

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

选择“熊猫”多索引组中的第一个子组

在熊猫组中查找第一个非零元素

熊猫从组中获取列的第一个和最后一个值

按连续事件分组的第一个和最后一个熊猫之间的差异

熊猫:返回值的第一个实例和最后一个实例的索引值

识别由熊猫中的多个列组成的组中的第一个非零元素

Python熊猫获得数据的第一个和最后一个索引,如果第一个也是最后一个,则重复

熊猫-从日期时间数据框中获取每天的第一个和最后一个值

熊猫groupby:将组中的最后一个除以组中的第一

识别熊猫组中的第一个非零元素

熊猫-仅重命名第一个词典匹配而不是最后一个匹配

如何在大熊猫中的组中创建最后值和第一个值之间存在差异的列

获取multindex熊猫系列级别中序列的第一个和最后一个元素

如何有效访问满足熊猫条件的第一个和最后一个出现索引

熊猫日期索引:选择每个月的第一个元素

熊猫通过保留一列的第一个元素和另一列的最后一个元素来合并

比较两个熊猫列,并返回与第二个元素匹配的第一个的索引

在3+列数据框中的熊猫中每个组的第一个和最后一个位置之前和之后添加行

Python熊猫:获取组的第一个值

熊猫将组分为第一个值和最后一个值

从最后一行熊猫数据框中获取第一个单元格

熊猫:与组中第一个元素的区别

获取带有偏移索引的熊猫数据框中的列的第一个值

熊猫拆分混合类型并获取第一个元素

按熊猫数据框唯一的第一个值分组 - 返回 numpy 数组

根据每个唯一记录熊猫数据帧的第一个和最后一个计算每个事件的总时间

熊猫如何获取数据框中所有非零值范围的第一个和最后一个日期?

根据熊猫中的第一个和最后一个逗号分隔列

熊猫:如何按列选择第一个或最后一个与 drop_duplicates 保持一致