2017-10-23 12 views
1

私は一連の郵便番号でインデックスされたデータの集まりを持っています。私は、地理的特徴の別のセット、例えば、近くの湖までの距離との距離に基づいて、これらのデータを集計したいと思います。要素が複数のカテゴリに属している場合、カテゴリ別にグループ化します。

1つのデータフレーム内の各湖をループし、50マイル以内にすべての郵便番号を返すようにhaversine関数を適用するのは簡単です。またはその逆。私は簡単にすべての郵便番号をループし、上記の郵便番号の50マイル以内に湖のリストを返すことができます。

しかし、これをもう少し効率的にやりたいと思います。各ジップが1つの湖にのみ対応している場合、最も近いと言えば、これを行う簡単な方法は新しい"lake"列を作成し、groupby("lake")を適用して処理のためにビニングされたデータを受け取ることです。

私が望むのは、グループの前に行を自動的に複製するテクニックです。私は、次のデータを持っていたと言う:

 lake 
zip 
10001 Huron 
10002 Huron, Erie 
10003 Erie, Superior 

私は次のことを返すようにgroupbyを呼び出すしたいと思います:

group 'Huron' 
zip 
10001 
10002 

group 'Erie' 
zip 
10002 
10003 

group 'Superior' 
zip 
10003 

基本的には、これを行うための任意の良い方法があるか、本質的に立ち往生しています汚いループスルーインデックスメソッド? stack + groupby続いexpand=True

答えて

1

オプション1
str.split、。これはグループを返します。

g = df.lake.str.split(',\s*', expand=True).stack()\ 
      .to_frame(name='lake').reset_index(level=1, drop=1).groupby('lake') 

for i, k in g: 
    print(k, '\n') 

     lake 
zip   
10002 Erie 
10003 Erie 

     lake 
zip   
10001 Huron 
10002 Huron 

      lake 
zip    
10003 Superior 



str.get_dummiesオプション2、私の好ましい方法。これはグループで結果を返しませんが、get_dummiesは暗黙のうちにグループに変換できるOHEを作成します。

g = df.lake.str.get_dummies(sep=r', ') 

for c in g.columns: 
    print('{}: {}'.format(c, g[c][g[c] > 0].index.tolist())) 

Erie: [10002, 10003] 
Huron: [10001, 10002] 
Superior: [10003] 
+0

これはトリックでした。乾杯。 –

関連する問題