我有以下数据框:
id Lat Lon Year Area State
50319 -36.0629 -62.3423 2019 90 Iowa
18873 -36.0629 -62.3423 2017 90 Iowa
18876 -36.0754 -62.327 2017 124 Illinois
18878 -36.0688 -62.3353 2017 138 Kansas
我想创建一个新列,该新列基于列Lat
,Lon
和Area
是否具有相同的值来分配唯一标识符。例如。在这种情况下,第1行和第2行在这些列中具有相同的值,并且将被赋予相同的唯一标识符0_Iowa
,其中Iowa
来自State
列。我尝试使用for循环,但是还有更多的Python方式吗?
id Lat Lon Year Area State unique_id
50319 -36.0629 -62.3423 2019 90 Iowa 0_Iowa
18873 -36.0629 -62.3423 2017 90 Iowa 0_Iowa
18876 -36.0754 -62.327 2017 124 Illinois 1_Illinois
18878 -36.0688 -62.3353 2017 138 Kansas 2_Kansas
答案 0 :(得分:5)
我将groupby.ngroup
设置为sort=False
进行分组,str.cat
将与State
进行连接以设置分隔符:
df['Sate'] = (df.groupby(['Lat','Lon','Area'], sort=False)
.ngroup()
.astype(str)
.str.cat(df.State, sep='_'))
print(df)
id Lat Lon Year Area State Sate
0 50319 -36.0629 -62.3423 2019 90 Iowa 0_Iowa
1 18873 -36.0629 -62.3423 2017 90 Iowa 0_Iowa
2 18876 -36.0754 -62.3270 2017 124 Illinois 1_Illinois
3 18878 -36.0688 -62.3353 2017 138 Kansas 2_Kansas
1
答案 1 :(得分:3)
您可以执行groupby.ngroup并添加“状态”列:
df['unique_id'] = (df.groupby(['Lat', 'Lon','Area'], sort=False).ngroup().astype(str)
+ '_' + df['State'])
print (df)
id Lat Lon Year Area State unique_id
0 50319 -36.0629 -62.3423 2019 90 Iowa 0_Iowa
1 18873 -36.0629 -62.3423 2017 90 Iowa 0_Iowa
2 18876 -36.0754 -62.3270 2017 124 Illinois 1_Illinois
3 18878 -36.0688 -62.3353 2017 138 Kansas 2_Kansas