在浮点值列上合并pandas DataFrame

时间:2016-12-14 05:20:04

标签: python pandas merge

我想要合并两个数据框。

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

数据框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浮点值的问题。有没有办法使用np.isclose来匹配col2的值?当我在任一数据帧中引用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

2 个答案:

答案 0 :(得分:7)

您可以使用一些hack - 多个浮点列,例如1001000 ...,将列转换为intmerge,最后除以常数:

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

答案 1 :(得分:1)

我有一个类似的问题,我需要识别具有数千个浮点列且没有标识符的匹配行。这种情况很困难,因为由于四舍五入,值可能会略有不同。

在这种情况下,我使用scipy.spatial.distance.cosine来获取行之间的余弦相似度。

from scipy import distance

threshold = 0.99999
similarity = 1 - spatial.distance.cosine(row1, row2)

if similarity >= threshold:
    # it's a match
else:
    # loop and check another row pair

如果您有重复的行或非常相似的行,这将不起作用,但是当您有大量的浮点列而不是太多的行时,它将很好地工作。