2016-12-14 7 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

この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

ありがとうございます。私は各グループの最後の2行を取得しようとしています。私は今アウトプットを編集しました。したがって、Id1 = 179の場合、最後のグループは185となるため、Id1 = 179とId2 = 185に対応する2つの行が必要です。 – user3447653

+0

@ user3447653、ちょっと編集しました。 – Abdou

1

あなたが最初に何の最後の値がboolean indexingdrop_duplicatesでないところフィルタリング、その後、列Id2の最後の値を見つけることができます。

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 
関連する問題