[英]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列排序。
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'
,你可以使用groupby
在'ID'
,然后檢查時, any
列的'Date','Lat','Lon'
比使用前一個不同的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.