2017-06-07 18 views
3

異なるサイズで2匹のパンダのデータフレームの比較:は、私がこのような構造を持つ1つの巨大なパンダのデータフレームを持って

df1: 
    A B 
0 0 12 
1 0 15 
2 0 17 
3 0 18 
4 1 45 
5 1 78 
6 1 96 
7 1 32 
8 2 45 
9 2 78 
10 2 44 
11 2 10 

そして、このような小さい第2の1、:

df2 
    G H 
0 0 15 
1 1 45 
2 2 31 

私はに列を追加しますこのルールに従った私の最初のデータフレーム:column df1.C = df2.H when df1.A == df2.G

私はループのためにそれをすることができますが、データベースは大量であり、コードは非常にゆっくり実行されますので、私はパンダの方法を探していますそれを行うにはnumpy。

多くのおかげで、

ボリス

+0

したがって、df2.Gのすべての要素はdf1.Aにあることが保証されていますか? df2.Gはソートされていますか?実際のユースケースでの入力データフレームの形は何ですか? – Divakar

+0

入力データにはより多くの列/行が含まれていますが、構造は同じです。私が必要とした機能は、完全に動作している 'DataFrame.merge()'でした。 – boris

答えて

1

おそらくマージを使用したい:

df=df1.merge(df2,left_on="A",right_on="G") 

はあなたに3列のデータフレームを与えるだろうが、三番目の名前はH

になります
df.columns=["A","B","C"] 

あなたが望む列名を指定します

+0

これは完璧に動作しています!どうもありがとう。 – boris

0

あなたはset_indexによって作成Seriesmapを使用することができます。

droprename
df1['C'] = df1['A'].map(df2.set_index('G')['H']) 
print (df1) 
    A B C 
0 0 12 15 
1 0 15 15 
2 0 17 15 
3 0 18 15 
4 1 45 45 
5 1 78 45 
6 1 96 45 
7 1 32 45 
8 2 45 31 
9 2 78 31 
10 2 44 31 
11 2 10 31 

またはmerge

df = df1.merge(df2,left_on="A",right_on="G", how='left') 
     .drop('G', axis=1) 
     .rename(columns={'H':'C'}) 
print (df) 
    A B C 
0 0 12 15 
1 0 15 15 
2 0 17 15 
3 0 18 15 
4 1 45 45 
5 1 78 45 
6 1 96 45 
7 1 32 45 
8 2 45 31 
9 2 78 31 
10 2 44 31 
11 2 10 31 
+0

多くの感謝!それも同様に動作しています – boris

0

ここでは1つのベクトル化numpyのアプローチだ -

idx = np.searchsorted(df2.G.values, df1.A.values) 
df1['C'] = df2.H.values[idx] 

idxは、df2.G.searchsorted(df1.A)という簡単な方法で計算できますが、これまでのようにパフォーマンスを向上させるために.valuesの基底配列を使用したいので、効率的ではないと考えています。

+0

多くのおかげで、それは同様に動作しています! – boris

+0

@borisあなたの最後にそれをタイムアウトさせてください。かなり効率的でなければなりません:) – Divakar

関連する問題