我使用ufunc的外部方法来计算结果,这是示例:
首先,一些数据:
import pandas as pdimport numpy as npdf_a = pd.Dataframe([{"a": 1, "b": 4}, {"a": 2, "b": 5}, {"a": 3, "b": 6}, {"a": 4, "b": 8}, {"a": 1, "b": 7}])df_b = pd.Dataframe([{"c": 2, "d": 7}, {"c": 3, "d": 8}, {"c": 2, "d": 10}])print "df_a"print df_aprint "df_b"print df_b输出:
df_a a b0 1 41 2 52 3 63 4 84 1 7df_b c d0 2 71 3 82 2 10
内部联接,因为这仅计算
c&的笛卡尔积
a,内存使用率小于整个Dataframe的笛卡尔积:
ia, ib = np.where(np.less.outer(df_a.a, df_b.c))print pd.concat((df_a.take(ia).reset_index(drop=True), df_b.take(ib).reset_index(drop=True)), axis=1)
输出:
a b c d0 1 4 2 71 1 4 3 82 1 4 2 103 2 5 3 84 1 7 2 75 1 7 3 86 1 7 2 10
要计算左外部联接,请使用
numpy.setdiff1d()查找
df_a不在内部联接中的所有行:
na = np.setdiff1d(np.arange(len(df_a)), ia)nb = -1 * np.ones_like(na)oa = np.concatenate((ia, na))ob = np.concatenate((ib, nb))print pd.concat([df_a.take(oa).reset_index(drop=True), df_b.take(ob).reset_index(drop=True)], axis=1)
输出:
a b c d0 1 4 2 71 1 4 3 82 1 4 2 103 2 5 3 84 1 7 2 75 1 7 3 86 1 7 2 107 3 6 NaN NaN8 4 8 NaN NaN



