如何使用组中的非唯一值枚举 pandas 中的行

How to enumerate rows in pandas with nonunique values in groups

我正在处理探险地理数据。能否根据探险ID(ID),日期(Date),纬度(Lat),经度(Lon)和一些值(Val,枚举不合理)帮助枚举站点和同一站点的记录?假设station是一组具有相同(ID,Date,Lat,Lon)的行,expedition是一组具有相同ID的行。 数据框按示例中的 4 列排序。

Dataset and required columns

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 但没有解决我的问题。

任何帮助!谢谢!

要创建 'St',您可以在 'ID' 上使用 groupby,然后检查 'Date','Lat','Lon' 列的 any 是否与前一列不同使用shift,并使用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' 上,然后使用 cumcountadd,例如:

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