2016-04-06 7 views
1

私はパンダ内の別の列に個別の値に対して1列に共通の値を見つける

event cust 
et1 satya 
et1 papu 
et1  abc 
et1 satya 
et1  def 
et2 papu 
et2 satya 
et2 panda 
et3 normal 
et3 panda 
et3 satya 
et3  fgh 

のようなデータフレームは、今私が得られるはずevents.so本のすべての3種類のために存在する「カスト」をfindoutする必要があります持っています

event cust 
et1 satya 
et1 satya 

個別の(重複を削除できる)ことを心配しないでください。この私のアプローチのために は

x = df[df['event'] == 'et1'] 
y = df[df['event'] == 'et2'] 
z = df[df['event'] == 'et3'] 
df_common = x[x['cust'].isin(y[y['cust'].isin(z.cust)]['cust'])] 

である。しかし、これはデータフレームのサイズが巨大になる場合には適切ではないだろうと私はいくつかの50-100 +のイベントのための共通のcustを見つける必要があります。

これを行うには、いくつかのパンダ/ピジョンソニックの方法をお勧めします。事前に感謝します。

答えて

1

あなたは試すことができます:

#first drop duplicates in each group by event 
df = df.drop_duplicates(['event','cust']) 

#count values 
counts = df.cust.value_counts() 
print counts 
satya  3 
panda  2 
papu  2 
def  1 
normal 1 
fgh  1 
abc  1 
Name: cust, dtype: int64 

#get number of unique events 
uniqevents = df.event.nunique() 
print uniqevents 
3 
#get values with count == uniqevents 
counts = counts[counts == uniqevents] 
print counts 
satya 3 
Name: cust, dtype: int64 

print counts.index.to_series().reset_index(drop=True) 
0 satya 
dtype: object 
+0

jezraelファイン@(すべてのイベントのための共通の)場合には.But私はいくつかの選択events.Likeであるカストは、イベントのための共通のcustを取得したい--ifについてet1&et2(et3を除く)。 – Satya

+0

私はそれに応じて私のdataFrameを最初にフィルタリングする必要があります。 df = df [df ['events']。isin(['et1'、 'et2'])]そして、あなたのアプローチに従うことができます。ちょうどそれをするために存在する任意のパンダの機能(もしあれば)があるのだろうか? – Satya

+0

はい、私は 'isin'と同様のものを書こうと思っています。私はそれを行う機能について知っていません。私は 'groupby'と' apply'を試みますが、成功しません。 – jezrael

関連する問題