如何在给定有序数值系列的情况下创建唯一的id列?

时间:2016-11-17 08:05:32

标签: python pandas numpy data-structures itertools

我正在处理具有以下结构的大型数据帧列:

在:

df1 = pd.DataFrame({'A': [0,0,0,1,2,0,1,0,1,2,3,4,5,6,7]})

输出:

    A
0   0
1   0
2   0
3   1
4   2
5   0
6   1
7   0
8   1
9   2
10  3
11  4
12  5
13  6
14  7

如您所见,A是从0到n的有序序列。这表示我的数据中的订单。例如:

    A
2   0
3   1
4   2
5   0

让我们将df1(从索引2添加到5),在A0代表开头{{1}表示序列的结尾。另一方面,如果没有连续数字(例如2),则表示该序列结束。因此,我的问题是如何有效地生成一个新列(例如0)符合基于id 的数字顺序的唯一键或数字:

A

我添加了一个图表以便更清楚。

1 个答案:

答案 0 :(得分:5)

我认为你可以使用:

select

print ((df1.A.diff() < 1).cumsum() + 1) 0 1 1 2 2 3 3 3 4 3 5 4 6 4 7 5 8 5 9 5 10 5 11 5 12 5 13 5 14 5 Name: A, dtype: int32 之后处理NaN时更为一般:

diff

说明:

首先通过diff找到差异:

dif = df1.A.diff()
dif.iloc[0] = df1.loc[0,'A']
print ((dif < 1).cumsum())
0     1
1     2
2     3
3     3
4     3
5     4
6     4
7     5
8     5
9     5
10    5
11    5
12    5
13    5
14    5
Name: A, dtype: int32

然后将第一个值(dif = df1.A.diff() print (dif) 0 NaN 1 0.0 2 0.0 3 1.0 4 1.0 5 -2.0 6 1.0 7 -1.0 8 1.0 9 1.0 10 1.0 11 1.0 12 1.0 13 1.0 14 1.0 Name: A, dtype: float64 )设置为原始值:

NaN

获取面具:

dif.iloc[0] = df1.loc[0,'A']

上次使用布尔掩码cumsum

print (dif < 1)
0      True
1      True
2      True
3     False
4     False
5      True
6     False
7      True
8     False
9     False
10    False
11    False
12    False
13    False
14    False
Name: A, dtype: bool