我正在使用探险地理数据。根据探险ID (ID)、日期( date )、纬度(Lat)、经度(Lon)和一些值(Val,枚举不合理),您是否可以帮助枚举同一站点的站点和记录?假设station是一组具有相同( ID,Date,Lat,Lon)的行,expedition是具有相同ID的一组行。数据帧按4列排序,如示例所示。
import pandas as pd
data = [[1,'2017/10/10',70.1,30.4,10],\
[1,'2017/10/10',70.1,31.4,20],\
[1,'2017/10/10',70.1,31.4,10],\
[1,'2017/10/10',70.1,31.4,10],\
[1,'2017/10/12',70.1,31.4,20],\
[2,'2017/12/10',70.1,30.4,20],\
[2,'2017/12/10',70.1,31.4,20]];
df = pd.DataFrame(data,columns=['ID','Date','Lat','Lon','Val']);
另外(我需要它,St代表站号,Rec代表同一站数据中的记录号;输出例如上述):
df['St'] = [1,2,2,2,3,1,2];
df['Rec'] = [1,1,2,3,1,1,1];
print(df)
我尝试并使用groupby/cumcount/agg/factorize,但没有解决我的问题。
有什么帮助吗!谢谢!
发布于 2018-08-09 14:23:15
要创建'St'
,您可以在'ID'
上使用groupby
,然后使用shift
检查列'Date','Lat','Lon'
的any
是否与前一个不同,并使用cumsum
获取您想要的数字,例如:
df['St'] = (df.groupby(['ID'])
.apply(lambda x: (x[['Date','Lat','Lon']].shift() != x[['Date','Lat','Lon']])
.any(axis=1).cumsum())).values
要创建'Rec'
,您还需要groupby
,但在所有列上使用'ID','Date','Lat','Lon'
,然后使用cumcount
和add
,如下所示:
df['Rec'] = df.groupby(['ID','Date','Lat','Lon']).cumcount().add(1)
然后你会得到:
ID Date Lat Lon Val St Rec
0 1 2017/10/10 70.1 30.4 10 1 1
1 1 2017/10/10 70.1 31.4 20 2 1
2 1 2017/10/10 70.1 31.4 10 2 2
3 1 2017/10/10 70.1 31.4 10 2 3
4 1 2017/10/12 70.1 31.4 20 3 1
5 2 2017/12/10 70.1 30.4 20 1 1
6 2 2017/12/10 70.1 31.4 20 2 1
https://stackoverflow.com/questions/51769016
复制