Python 熊猫:对于两个或更多特定列值完全相同的行组,如何将唯一整数指定为新列
在数据帧中,我有两组行,其中两个特定列的值完全相同。如何为这些行添加一个新列,从整数1(不是整数0)开始分配一个唯一的整数?任何完全唯一的行也会得到一个int 这是一个示例数据帧,其中第2列和第3列在多组行之间共享相同的值Python 熊猫:对于两个或更多特定列值完全相同的行组,如何将唯一整数指定为新列,python,pandas,Python,Pandas,在数据帧中,我有两组行,其中两个特定列的值完全相同。如何为这些行添加一个新列,从整数1(不是整数0)开始分配一个唯一的整数?任何完全唯一的行也会得到一个int 这是一个示例数据帧,其中第2列和第3列在多组行之间共享相同的值 df = pd.DataFrame([['plane1', '', 'az'] , ['plane2', '', 'az'] , ['plane3', 'az', ''] , ['plane4', 'az', ''] , ['plane5', 'ny', ''] , ['pl
df = pd.DataFrame([['plane1', '', 'az'] , ['plane2', '', 'az'] , ['plane3', 'az', ''] , ['plane4', 'az', ''] , ['plane5', 'ny', ''] , ['plane6', 'ny', ''], ['plane7', 'fl', 'fl'], ['plane8', 'fl', 'fl'], ['plane10', '', 'de'], ['plane11', '', 'de'], ['plane12', '', 'mo'], ['plane13', '', 'mo']])
输出
0 1 2
0 plane1 az
1 plane2 az
2 plane3 az
3 plane4 az
4 plane5 ny
5 plane6 ny
6 plane7 fl fl
7 plane8 fl fl
8 plane10 de
9 plane11 de
10 plane12 mo
11 plane13 mo
这是所需的输出,使用精心制作的示例数据帧
df = pd.DataFrame([['plane1', '', 'az', 1] , ['plane2', '', 'az', 1] , ['plane3', 'az', '', 2] , ['plane4', 'az', '', 2] , ['plane41', 'az', '', 2], ['plane5', 'ny', '', 3] , ['plane6', 'ny', '', 3], ['plane7', 'fl', 'fl', 4], ['plane8', 'fl', 'fl', 4], ['plane10', '', 'de', 5], ['plane11', '', 'de', 5], ['plane12', '', 'mo', 6], ['plane13', '', 'mo', 6]])
灌肠
0 1 2 3
0 plane1 az 1
1 plane2 az 1
2 plane3 az 2
3 plane4 az 2
4 plane41 az 2
5 plane5 ny 3
6 plane6 ny 3
7 plane7 fl fl 4
8 plane8 fl fl 4
9 plane10 de 5
10 plane11 de 5
11 plane12 mo 6
12 plane13 mo 6
在您的情况下,转换为
元组后分解
df[3]=pd.factorize(df[[1,2]].apply(tuple,1))[0]+1
df
0 1 2 3
0 plane1 az 1
1 plane2 az 1
2 plane3 az 2
3 plane4 az 2
4 plane5 ny 3
5 plane6 ny 3
6 plane7 fl fl 4
7 plane8 fl fl 4
8 plane10 de 5
9 plane11 de 5
10 plane12 mo 6
11 plane13 mo 6
或
或将类别与类别代码一起使用
df[[1,2]].apply(tuple,1).astype(category).cat.codes
如果您只需要唯一的值,可以使用hash
df[[1,2]].apply(tuple,1).apply(hash,1)
使用groupby
和sort=False
和ngroup
df[3] = df.groupby([1,2], sort=False).ngroup()+1
Out[1261]:
0 1 2 3
0 plane1 az 1
1 plane2 az 1
2 plane3 az 2
3 plane4 az 2
4 plane5 ny 3
5 plane6 ny 3
6 plane7 fl fl 4
7 plane8 fl fl 4
8 plane10 de 5
9 plane11 de 5
10 plane12 mo 6
11 plane13 mo 6
df[3] = df.groupby([1,2], sort=False).ngroup()+1
Out[1261]:
0 1 2 3
0 plane1 az 1
1 plane2 az 1
2 plane3 az 2
3 plane4 az 2
4 plane5 ny 3
5 plane6 ny 3
6 plane7 fl fl 4
7 plane8 fl fl 4
8 plane10 de 5
9 plane11 de 5
10 plane12 mo 6
11 plane13 mo 6