在浮点值列上合并 pandas DataFrame

Posted

技术标签:

【中文标题】在浮点值列上合并 pandas DataFrame【英文标题】:Merge pandas DataFrame on column of float values 【发布时间】:2017-04-29 08:33:20 【问题描述】:

我有两个要合并的数据框。

数据框 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

【问题讨论】:

显示预期结果的外观 我已经编辑了帖子以反映所需的输出。 @Megan 在您的加入中,您删除了一些行。检查我关于如何基于两列合并的答案。您可以在合并后应用附加逻辑。 @MohammadYusufGhazi 我编辑了帖子以添加我之前错过的列,但我不确定您在合并后应用额外逻辑是什么意思。 【参考方案1】:

您可以使用一些小技巧 - 多个浮点列由某个常量(如 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

【讨论】:

哦。加入小数点会不准确吗? 是的,有可能,但我认为效率低下看这个comment 不错的方法,但由于舍入错误会导致更微妙的错误。更好地使用 A.col2 = np.round(A.col2*N).astype(int) @koalo - 非常感谢,我添加了它的答案。 2020 年更新:您现在只需执行 np.round(col, decimals=2) 即可。不确定这在以前是否不可能,但它对我来说效果很好,看起来更干净了:)【参考方案2】:

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

在这种情况下,我使用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

如果您有重复或非常相似的行,这将不起作用,但当您有大量浮动列且行数不多时,它会很好。

【讨论】:

以上是关于在浮点值列上合并 pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

在 2 列上合并 pandas 数据帧,但以任意顺序

pandas中,dataframe 进行数据合并-pd.concat()

Pandas:如何在现有 DataFrame 的列上设置索引?

Pandas python合并多个文件文本

Pandas DataFrame - 在 whos dtype=='category' 列上聚合会导致性能下降

在 Pandas 中合并索引上的数据帧更有效