簡體   English   中英

如何用組中非唯一值枚舉熊貓中的行

[英]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'然后使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM