2016-12-14 81 views
1

我有以下格式的一組點。對於每個Id1,都有一組Id2與他們的經度和緯度。對於每組Id1和Id2,我需要組 中的第一條記錄,除了最後一組,其中我需要第一個和最後一個記錄。請參閱下面的輸出。按熊貓數據框中的數據分組

只是想知道是否有一種方法在熊貓我可以做到這一點。任何幫助,將不勝感激。謝謝。

Id1  Id2  Latitude  Longitude 
    179  183  33.67   -83.24 
    179  183  31.33   -83.11 
    179  184  33.58   -83.34 
    179  184  33.61   -83.14 
    179  185  33.60   -83.54 
    179  185  33.60   -83.54 
    180  185  33.67   -83.64 
    180  185  33.79   -83.74 
    180  186  33.81   -83.84 
    180  186  33.81   -83.84 

輸出:

Id1  Id2  Latitude  Longitude 
    179  183  33.67   -83.24 
    179  184  33.58   -83.34 
    179  185  33.60   -83.54 
    179  185  33.60   -83.54 
    179  186  33.79   -83.74 
    179  186  33.81   -83.84 
    180  185  33.67   -83.64 
    180  186  33.81   -83.84 
    180  186  33.81   -83.88 
+0

你是什麼意思的'最後一組'?在最後的意義上? – IanS

+0

如果我們按Id1和Id2排序,最後一組將是179,186在我的示例中 – user3447653

+0

在每組中只有2行? – jezrael

回答

1

這個人是有點少大熊貓爲導向的,但它使用group-by操作:

# Function to check if row values are equal to last_group values 
def compare_to_groups(x, last_groups): 
    return any((x[['Id1','Id2']] == last_groups[i]).all(1).any() for i in range(len(last_groups))) 

# Get the last groups 
last_groups = df.groupby('Id1')['Id1','Id2'].last().values 

# Apply to each group 
df.groupby(['Id1','Id2']).apply(lambda x: x if compare_to_groups(x, last_groups) else x.head(1)).reset_index(drop=True) 

它應該產生:

Id1 Id2 Latitude Longitude 
0 179 183  33.67  -83.24 
1 179 184  33.58  -83.34 
2 179 185  33.60  -83.54 
3 179 185  33.60  -83.54 
4 180 185  33.67  -83.64 
5 180 186  33.81  -83.84 
6 180 186  33.81  -83.84 

我希望這會有所幫助。

+0

謝謝。我正在嘗試爲每個組檢索最後兩行。我現在編輯了輸出。因此,對於Id1 = 179,最後一組將是185,因此我需要對應於Id1 = 179和Id2 = 185的兩行。 – user3447653

+0

@ user3447653,只做了一些編輯。 – Abdou

1

你可以先找到Id2列的最後一個值,然後過濾哪裏都是由boolean indexingdrop_duplicates沒有最後的值:

last_row = df['Id2'].iloc[-1] 
print (last_row) 
186 

df1 = df[df.Id2 != last_row].drop_duplicates(['Id1','Id2']) 
print (df1) 
    Id1 Id2 Latitude Longitude 
0 179 183  33.67  -83.24 
2 179 184  33.58  -83.34 
4 179 185  33.60  -83.54 
7 180 185  33.67  -83.64 

然後用最後篩選值值在Id2

df2 = df[df.Id2 == last_row] 
print (df2) 
    Id1 Id2 Latitude Longitude 
5 179 186  33.81  -83.84 
6 179 186  33.81  -83.84 
9 180 186  33.81  -83.84 
10 180 186  33.81  -83.84 

而在去年concat在一起:

print (pd.concat([df1,df2]).reset_index(drop=True)) 
    Id1 Id2 Latitude Longitude 
0 179 183  33.67  -83.24 
1 179 184  33.58  -83.34 
2 179 185  33.60  -83.54 
3 180 185  33.67  -83.64 
4 179 186  33.81  -83.84 
5 179 186  33.81  -83.84 
6 180 186  33.81  -83.84 
7 180 186  33.81  -83.84 

如果只需要最後一組變化情況:

lastId1 = df['Id1'].iloc[-1] 
print (lastId1) 
180 
lastId2 = df['Id2'].iloc[-1] 
print (lastId2) 
186 

mask = (df.Id1 == lastId1) & (df.Id2 == lastId2) 
df1 = df[~mask].drop_duplicates(['Id1','Id2']).drop_duplicates(['Id1','Id2']) 
print (df1) 
    Id1 Id2 Latitude Longitude 
0 179 183  33.67  -83.24 
2 179 184  33.58  -83.34 
4 179 185  33.60  -83.54 
5 179 186  33.81  -83.84 
7 180 185  33.67  -83.64 

df2 = df[mask] 
print (df2) 
    Id1 Id2 Latitude Longitude 
9 180 186  33.81  -83.84 
10 180 186  33.81  -83.84 

print (pd.concat([df1,df2]).reset_index(drop=True)) 
    Id1 Id2 Latitude Longitude 
0 179 183  33.67  -83.24 
1 179 184  33.58  -83.34 
2 179 185  33.60  -83.54 
3 179 186  33.81  -83.84 
4 180 185  33.67  -83.64 
5 180 186  33.81  -83.84 
6 180 186  33.81  -83.84