数据帧比较

问题描述 投票:0回答:3

我有一个工作强力嵌套用于循环解决方案,用于比较两个数据帧并进入工作解决方案。我想要更有效率。假设我在下面的示例中有两个数据帧。如何将df2中的所有数据(作为字符串)附加到df1,其中df1不等于df2。

import pandas as pd
import numpy as np
df1=pd.DataFrame({'Col1' : ['blue', 2, 3, 4], 'Col2' : [90, 99, 3, 97], 'Col3' : [11, 12, 13, 14]})
df2=pd.DataFrame({'Col1' : ['blue', 2, 3, 6], 'Col2' : [90, 99, 99, 97], 'Col3' : [11, 12, 13, 14]})

我试过了:

np.where(df1.ne(df2),str(df1)+str(df2),0)

结果应该是:

array([[0, 0, 0],
       [0, 0, 0],
       [0, '3 99', 0],
       ['4 6', 0, 0]])

这种更高效的尝试是内存错误的噩梦而且是错误的。

结果在第一个单元格中显示“蓝绿色”或“蓝色\绿色”。有人有主意吗?我将每天将此解决方案应用于数百万乘40的数据帧,并希望限制结果的生产时间。

python-3.x pandas numpy
3个回答
2
投票

鉴于您的意见:

df1=pd.DataFrame({'Col1' : ['blue', 2, 3, 4], 'Col2' : [90, 99, 3, 97], 'Col3' : [11, 12, 13, 14]})
df2=pd.DataFrame({'Col1' : ['blue', 2, 3, 6], 'Col2' : [90, 99, 99, 97], 'Col3' : [11, 12, 13, 14]})

创建一个面具:

mask = df1.ne(df2)

然后......把你的df作为字符串,然后连接匹配的元素,填写nans,然后取.values,例如:

result = (df1.astype(str)[mask] + ' ' + df2.astype(str)[mask]).fillna(0).values

给你:

array([[0, 0, 0],
       [0, 0, 0],
       [0, '3 99', 0],
       ['4 6', 0, 0]], dtype=object)

1
投票

您可以使用apply方法应用一个函数来检查每列的相等性,返回True或False值的所需输出。

df1.apply(lambda x: np.where(x != df2[x.name], x.map(str).str.cat(df2[x.name].map(str), sep=' '), x))
         Col1  Col2  Col3
0  blue green  4 90    11
1         2 4  4 99    12
2         3 5  5 99    13
3         4 6  6 97    14

在这种情况下,您也可以使用DataFrame.where代替np.where

df1.apply(lambda x: x.where(x == df2[x.name], x.map(str).str.cat(df2[x.name].map(str), sep=' ')))

1
投票

我认为这是一个简单的方法。

cond = df1!=df2
df3 = df1.where(cond,0).astype(str) + " "+ df2.where(cond,0).astype(str)
df3[ ~cond ] = 0
df3
© www.soinside.com 2019 - 2024. All rights reserved.