2017-06-29 21 views
2

私は、各旅行の日時情報とユーザIDを持つ旅行データを持っています。私は、そのユーザーの次回の旅行のdatetime情報で "next_trip"という新しい列を作成しようとしています。ここでforループ内のパンダクエリ条件

はAll_Dataという名前のデータサンプル(パンダのデータフレーム)、です:

HoraDTRetirada  idpass              

2016-02-17 15:36:00 39579449489  
2016-02-24 19:13:00 48663837456  
2016-02-26 09:20:00 72986744521  
2016-02-28 12:11:00 85935174645  
2016-02-28 14:55:00 11533148958 

私はこれを行うに思っ方法は、最初にすることによって、彼の次の旅行を見つけ、その後、それぞれ異なるユーザー旅行のため、日時によってエントリをソートしてユーザーID(idpass)によるフィルタリング(クエリによる)。私が再インデックス化するのは、重複エラーが発生したためです。 そして、ここでは、私がこれまでに作ってみたコードです:

unique_ids = All_Data['idpass'].unique() 
temp = All_Data.sort_values('HoraDTRetirada') 
temp['index'] = np.arange(len(temp)) 
temp = temp.set_index('index') 

for row in unique_ids: 
    temp["next_trip"]=temp.query('idpass == "%s"' % row)["HoraDTRetirada"].shift(-1) 

私の問題は、forループに関連しています。これを手動で行い、クエリ条件で使用するidpassの値を選択すると、そのユーザーのトリップの正しいエントリが新しい列(next_trip)として取得されますが、forループを使用してすべてのidpass値に対して行われるようにしようとすると、私はNaTしか得ません。

何か助けていただければ幸いです。ありがとう!

答えて

1

あなたがDataFrameGroupBy.shiftgroupby必要があるようだ:

#data changed for no NaT output - need size of each group 2 or more 
print (All_Data) 
     HoraDTRetirada  idpass 
0 2016-02-17 15:36:00 39579449489 
1 2016-02-24 19:13:00 39579449489 
2 2016-02-26 09:20:00 39579449489 
3 2016-02-28 12:11:00 85935174645 
4 2016-02-28 14:55:00 85935174645 


All_Data = All_Data.sort_values('HoraDTRetirada') 
All_Data['next_trip'] = All_Data.groupby('idpass')['HoraDTRetirada'].shift(-1) 
print (All_Data) 
     HoraDTRetirada  idpass   next_trip 
0 2016-02-17 15:36:00 39579449489 2016-02-24 19:13:00 
1 2016-02-24 19:13:00 39579449489 2016-02-26 09:20:00 
2 2016-02-26 09:20:00 39579449489     NaN 
3 2016-02-28 12:11:00 85935174645 2016-02-28 14:55:00 
4 2016-02-28 14:55:00 85935174645     NaN 
+0

完璧に動作します。ありがとうございました! – Helk

+0

次のコードで、各ユーザー(idpass)のsame_day_tripsの数を持つ列を生成するために同じ考えを適用しようとしていますが、動作しません: 'All_Data ['same_day_trips'] = All_Data.groupby([ idpass '、' day '、' month '])。value_counts() '。 'AttributeError: 'DataFrameGroupBy'オブジェクトに 'value_counts'属性がありません。 – Helk

+1

size-' All_Data1 = All_Data.groupby(['idpass'、 'day'、 'month'])が必要です。 ( 'idpass')。transform( 'size') 'size ')' size =' size '); //新しい列に必要なものがあれば 'All_Data [' same_day_trips '] = All_Data.groupby([' idpass '、' day '、' month ' – jezrael

関連する問題