我正在处理具有以下结构的大型数据帧列:
在:
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
),在A
列0
代表开头{{1}表示序列的结尾。另一方面,如果没有连续数字(例如2
),则表示该序列结束。因此,我的问题是如何有效地生成一个新列(例如0
)符合基于id
的数字顺序的唯一键或数字:
A
我添加了一个图表以便更清楚。
答案 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