2017-06-20 7 views
2

データの問題に取り残されています。以下は私のデータである: はまずPython Data Wrangling:DataFrameの値をループし、現在のイテレータが元のイテレータと一致するかどうかを確認します。

Year = ['2010','2011','2012','2013','2014','2015','2010','2011','2014','2015','2016','2010','2011','2012','2015'] 
Type = ['WAS','WAS','BOS','BOS','WAS','BOS','BOS','BOS','WAS','WAS','BOS','BOS','BOS','BOS','BOS'] 
ID = ['a','a','a','a','a','a','b','b','b','b','b','c','c','c','c'] 
df = pd.DataFrame({'ID': ID,'Type': Type,'Year': Year}) 

df 
a WAS 2010 
a WAS 2011 
a BOS 2012 
a BOS 2013 
a WAS 2014 
and so on............... 

私は二つのことを達成しようとしています... - 私はidが同じであることを確認し、決定し、データフレームを通って、行ごとにループにしたい以前入力した場合現在のイテレーター型と一致します。次に、2つの新しいバイナリ変数 'WAStoBOS'と 'BOStoWAS'を作成し、変更がまったくない場合や変数名と同じでない場合は0を返し、変数の方向に変更がある場合は1を返します名。例えば

、出力は次のようになります。

df 
ID Type Year WAStoBOS BOStoWAS 
a WAS 2010 0 0 
a WAS 2011 0 0 
a BOS 2012 1 0 
a BOS 2013 0 0 
a WAS 2014 0 1 
a BOS 2015 1 0 

第二:同じ構文内 は、IDによって、現在の行の年と前の行の年の差を検索します。

最終結果のデータフレームは、次のようになります。

df 
ID Type Year WAStoBOS BOStoWAS YearDiff 
a WAS 2010 0 0 0 
a WAS 2011 0 0 1 
a BOS 2012 1 0 1 
a BOS 2013 0 0 1 
a WAS 2014 0 1 1 
a BOS 2015 1 0 1 
b BOS 2010 0 0 0 
b BOS 2011 0 0 1 
b WAS 2014 0 1 3 
b WAS 2015 0 0 1 
b BOS 2016 1 0 1 
c BOS 2010 0 0 0 
c BOS 2011 0 0 1 
c BOS 2012 0 0 1 
c BOS 2015 0 0 3 

任意の助けをいただければ幸いです。


この編集はScottsの提案の後です。

たとえば、コードでIDとタイプが変更されたインスタンスに1が間違って割り当てられます。 IDが変更された場合、以前のタイプが何であっても気にしません... IDとタイプの変更を考慮して少し下のデータフレームを変更して、希望の出力を表示してください...

 df 
ID Type Year WAStoBOS BOStoWAS YearDiff 
a WAS 2010 0 0 0 
a WAS 2011 0 0 1 
a BOS 2012 1 0 1 
a BOS 2013 0 0 1 
a WAS 2014 0 1 1 
**a BOS 2015** 1 0 1 
**b WAS 2010** 0 0 0 
b BOS 2011 1 0 1 
b WAS 2014 0 1 3 
b WAS 2015 0 0 1 
**b WAS 2016** 0 0 1 
**c BOS 2010** 0 0 0 
c BOS 2011 0 0 1 
c BOS 2012 0 0 1 
c BOS 2015 0 0 3 

参照のためにIDとタイプに変更がある場合は、アスタリスクを付けてください。助けてくれてありがとう、私は割り当てを使うことについて決して考えなかった。考慮した 'ID' とのバイナリを割り当てる

+0

私はpd.Seriesように感じます。シフト()はあなたがここで欲しいものになるでしょう... –

答えて

3

EDIT:

df.assign(WAStoBOS=df.groupby('ID')['Type'].transform(lambda x: ((x == 'BOS') & (x.shift(1) == 'WAS')).astype(int)), 
      BOStoWAS=df.groupby('ID')['Type'].transform(lambda x: ((x == 'WAS') & (x.shift(1) == 'BOS')).astype(int)), 
      YearDiff=df.groupby('ID')['Year'].transform(lambda x: x.astype(int).diff().fillna(0))) 

のは、1つのステートメントでこれを実行してみましょう:

df.assign(WAStoBost=((df.Type == 'BOS') & (df.shift(1).Type == 'WAS')).astype(int), 
      BOStoWAS=((df.Type=='WAS')&(df.shift(1).Type == 'BOS')).astype(int), 
      YearDiff=df.groupby('ID')['Year'].transform(lambda x: x.astype(int).diff().fillna(0))) 

出力:

ID Type Year BOStoWAS WAStoBost YearDiff 
0 a WAS 2010   0   0  0.0 
1 a WAS 2011   0   0  1.0 
2 a BOS 2012   0   1  1.0 
3 a BOS 2013   0   0  1.0 
4 a WAS 2014   1   0  1.0 
5 a BOS 2015   0   1  1.0 
6 b BOS 2010   0   0  0.0 
7 b BOS 2011   0   0  1.0 
8 b WAS 2014   1   0  3.0 
9 b WAS 2015   0   0  1.0 
10 b BOS 2016   0   1  1.0 
11 c BOS 2010   0   0  0.0 
12 c BOS 2011   0   0  1.0 
13 c BOS 2012   0   0  1.0 
14 c BOS 2015   0   0  3.0 
+0

ありがとうScott - これは私の望ましい出力に非常に近いです。必要な追加は、 'WAStoBOS'と 'BOStoWAS'にバイナリーフラグを割り当てるときに、IDが考慮されていることを確認することです。私は元の希望のテーブルを少し変更して、私が何を意味するかを示します。ありがとう! – boothtp

+0

さて、出力を修正しました。 –

+0

ありがとうScott - それはまさに私が探していたものです! – boothtp

関連する問題