考虑两个数据框df1
和df2
df1 = pd.DataFrame(np.zeros((6, 6)), list('abcdef'), list('abcdef'), dtype=int)
df1.iloc[2:4, 2:4] = np.array([[1, 2], [3, 4]])
df1
df2 = pd.DataFrame(np.array([[1, 2], [3, 4]]), list('CD'), list('CD'), dtype=int)
df2
很明显,df2
位于df1
。我如何测试这一般?
答案 0 :(得分:3)
假设数据框仅包含0's
和1s
,您可以使用2D convolution
并查看回旋输出中的任何元素是否等于df2
中的元素数量 -
from scipy.signal import convolve2d
out = (convolve2d(df1,df2)==df2.size).any()
对于一般情况,让我使用skimage
module和this smart solution
-
from skimage.util import view_as_windows as viewW
out = ((viewW(df1.values, df2.shape) == df2.values).all(axis=(2,3))).any()
这基本上是一个模板匹配问题,已经讨论过,我们在这篇文章中得到了非常有效的解决方案:How can I check if one two-dimensional NumPy array contains a specific pattern of values inside it?
。该帖子还为我们提供了df1
中可能找到df2
的所有地点的索引。
答案 1 :(得分:1)
def isin2d(small_df, large_df):
di, dj = small_df.shape
mi, mj = large_df.shape
for i in range(mi - di + 1):
for j in range(mj - dj + 1):
if (small_df.values == large_df.values[i:i + di, j:j + dj]).all():
return True
return False
isin2d(df2, df1)
True