Pandas:对于 2 个或更多特定列值完全相同的行组,如何将唯一整数分配为新列

  • 本文关键字:新列 分配 整数 唯一 对于 Pandas python pandas
  • 更新时间 :
  • 英文 :


在 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

groupbysort=Falsengroup一起使用

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)

最新更新