在浮点值列上合并 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】:您可以使用一些小技巧 - 多个浮点列由某个常量(如 100
、1000
...)、将列转换为 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
【讨论】:
哦。加入小数点会不准确吗? 是的,有可能,但我认为效率低下看这个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的主要内容,如果未能解决你的问题,请参考以下文章
pandas中,dataframe 进行数据合并-pd.concat()
Pandas:如何在现有 DataFrame 的列上设置索引?