2016-12-14 14 views
3

私はマージしようとしている2つのデータフレームを持っています。浮動小数点値の列にpandas DataFrameをマージする

DATAFRAME A:

col1 col2 sub grade 
0 1  34.32 x  a 
1 1  34.32 x  b 
2 1  34.33 y  c 
3 2  10.14 z  b 
4 3  33.01 z  a 

DATAFRAME B:

col1 col2 group ID 
0 1  34.32 t  z 
1 1  54.32 s  w 
2 1  34.33 r  z 
3 2  10.14 q  z 
4 3  33.01 q  e 

私はcol1とcol2の上でマージしたいです。私は、次の構文でpd.mergeしてきた:

pd.merge(A, B, how = 'outer', on = ['col1', 'col2']) 

しかし、私は多くの行がドロップされているので、私はCOL2のfloat値に参加問題に実行していると思います。 col2の値を一致させるためにnp.iscloseを使用する方法はありますか?いずれかのデータフレームでcol2の特定の値のインデックスを参照すると、その値はデータフレームに表示されるものよりも多くの小数点以下の桁を持ちます。

私は結果がなりたい:

col1 col2 sub grade group ID 
0 1  34.32 x  a  t  z 
1 1  34.32 x  b  s  w 
2 1  54.32 s  w  NaN  NaN 
3 1  34.33 y  c  r  z 
4 2  10.14 z  b  q  z 
5 3  33.01 z  a  q  e 
+0

期待される結果をどのように表示するかを示します。 – RomanPerekhrest

+0

希望の出力を反映するように投稿を編集しました。 – Megan

+0

@Meganあなたの参加でいくつかの行を削除しました。 2つの列に基づいてマージする方法について私の答えをチェックしてください。マージ後に追加ロジックを適用することができます。 – MYGz

答えて

3

あなたは少しハック使用することができます - で、... 1001000のようないくつかの定数することにより、複数のフロートの列をintに列を変換し、mergeと最後の除算定数:

N = 100 
#thank you koalo for comment 
A.col2 = np.round(A.col2*N).astype(int) 
B.col2 = np.round(B.col2*N).astype(int) 
df = pd.merge(A, B, how = 'outer', on = ['col1', 'col2']) 
df.col2 = df.col2/N 
print (df) 
    col1 col2 sub grade group ID 
0  1 34.32 x  a  t z 
1  1 34.32 x  b  t z 
2  1 34.33 y  c  r z 
3  2 10.14 z  b  q z 
4  3 33.01 z  a  q e 
5  1 54.32 NaN NaN  s w 
+0

ああ小数点の結合は正確ではありませんか? – MYGz

+0

はい、可能ですが、私はそれが非効率的だと思います[コメント](http://stackoverflow.com/questions/38114654/pandas-read-csv-column-dtype-is-set-to-decimal-but -converts-to-string/38114744#comment63666221_38114744) – jezrael

+0

良いアプローチですが、丸め誤差のためにさらに微妙なバグにつながります。より良い使用A.col2 = np.round(A.col2 * N).astype(int) – koalo

関連する問題