如何使用组中的非唯一值枚举 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'
上,然后使用 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
我正在处理探险地理数据。能否根据探险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'
上,然后使用 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