Python Pandas两个Pandas数据帧之间的自动连接
有人知道如何找到两个数据帧之间的潜在连接吗 我想搜索这些数据集的列之间的潜在匹配 我已经发展出了类似的东西Python Pandas两个Pandas数据帧之间的自动连接,python,pandas,Python,Pandas,有人知道如何找到两个数据帧之间的潜在连接吗 我想搜索这些数据集的列之间的潜在匹配 我已经发展出了类似的东西 from tqdm import tqdm import numpy as np def _check_na(df, col, threshold=0.9): return sum(df[col].isna()) > (1- threshold) * df.shape[0] def _check_dtype(df1, df2, c1, c2): try
from tqdm import tqdm
import numpy as np
def _check_na(df, col, threshold=0.9):
return sum(df[col].isna()) > (1- threshold) * df.shape[0]
def _check_dtype(df1, df2, c1, c2):
try:
df1[c1] = df1[c1].astype(df2.dtypes[c2])
return True
except:
return False
def _fast_intersect(df1, df2, c1, c2, perc=0.2, maxrows=1000):
n = min(df1.shape[0], df2.shape[0])
c=1
if n>maxrows:
c = len(np.intersect1d(df1[c1].sample(n= maxrows, random_state=0).astype(str).values, df2[c2].astype(str)) )
if (c>0) or n<=maxrows:
return len(np.intersect1d(df1[c1].astype(str).values, df2[c2].astype(str).values))
return 0
def possible_join(df1, df2, threshold=0.8, verbose=0):
n = min(df1.shape[0], df2.shape[0])
for c1 in tqdm(df1.columns):
if _check_na(df1, c1):
if verbose>1:
print('WARN: too many na',c1)
continue
for c2 in df2.columns:
if not(_check_dtype(df1, df2, c1, c2)):
if verbose>1:
print('WARN: incompatible type',c1, df1.dtypes[c1],c2, df2.dtypes[c2])
continue
if _check_na(df2, c2):
if verbose>1:
print('WARN: too many na',c2)
continue
c = _fast_intersect(df1, df2, c1, c2)
print(c)
if (c>= threshold * n):
print ('** MATCH **:', c1,'-',c2,':', c, c/n, '%')
elif (c>= threshold * n /2):
print ('** LOW MATCH **:',c1,'-',c2,':', c, c/n, '%')
结果是
col21和col22 100%完全匹配
col11和col12的50%低匹配
在
\u fast\u intersect
中使用这种代码和平:
first_df = df1.sample(n= int(n * perc), random_state=0)
second_df = df2
return pd.merge(first_df, second_df, how="inner", on="c2").shape[0]
在
\u fast\u intersect
中使用这种代码和平:
first_df = df1.sample(n= int(n * perc), random_state=0)
second_df = df2
return pd.merge(first_df, second_df, how="inner", on="c2").shape[0]
你知道瓶颈在哪里吗?也许你应该做点别的,而不是
相交?例如,您可以使用pandas
的join
而不是intersect
,然后获取count
如果您可以解释更多您的目标以及相应的阈值的预期输出(您的“测试”不包含任何预期输出),那将是一件好事.根据请求更新帖子您知道瓶颈在哪里吗?也许你应该做点别的,而不是相交?例如,您可以使用pandas
的join
而不是intersect
,然后获取count
如果您可以解释更多您的目标以及相应的阈值的预期输出(您的“测试”不包含任何预期输出),那将是一件好事.post根据请求更新原始版本中的\u fast\u intersect
似乎返回一个整数,并以此方式使用。也许你的意思是“可能加入”
?但这似乎不仅仅是一个合并。嵌入原始版本\u fast\u intersect
中的注释似乎返回一个整数,并以此方式使用。也许你的意思是“可能加入”
?但这似乎不仅仅是一次合并