我有一个工作强力嵌套用于循环解决方案,用于比较两个数据帧并进入工作解决方案。我想要更有效率。假设我在下面的示例中有两个数据帧。如何将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的数据帧,并希望限制结果的生产时间。
鉴于您的意见:
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)
您可以使用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=' ')))
我认为这是一个简单的方法。
cond = df1!=df2
df3 = df1.where(cond,0).astype(str) + " "+ df2.where(cond,0).astype(str)
df3[ ~cond ] = 0
df3