在 Pandas 数据帧中,我有一组行,其中 2 个特定列的值完全相同。如何为这些行添加一个新列,该列分配一个唯一的整数,从整数 1(不是整数 0(开始?任何完全唯一的行也会得到一个 int。
这是一个示例数据帧,其中第 2 列和第 3 列将在行组之间共享相同的值
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
将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
在您的情况下factorize
转换为tuple
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
或
pd.factorize(df[[1,2]].replace('',' ').sum(1))[0]+1
或者将类别与cat.codes
一起使用
df[[1,2]].apply(tuple,1).astype(category).cat.codes
如果您只想要唯一值,您可以检查hash
df[[1,2]].apply(tuple,1).apply(hash,1)