在单个数据框中显示所有匹配对-Python记录链接

时间:2019-01-24 15:06:05

标签: python pandas dataframe multi-index record-linkage

我有一个熊猫MultiIndex对象:

authenticated

此MultiIndex对象定义以下8对: (1,10), (1,11), (2,10), (2,11), (3,10), (3,11), (8,10), (8,11)。

级别中列出的元素对应于DataFrame的索引:

authenticate

我想要创建一个新的DataFrame来显示上面定义的所有对。看起来像这样:

select distinct A.COUNTRY_NAME from TABLE1 A, TABLE2 B 
where  upper(trim(B.COUNTRY_NAME)) LIKE '%' || upper(trim(A.COUNTRY_NAME))  || '%'

有没有有效的方法来实现这一目标? (如果可能,没有for循环)

预先感谢

3 个答案:

答案 0 :(得分:4)

stackilocreindex一起使用

df.iloc[m.to_frame().stack()].assign(key=m.to_frame().reset_index(drop=True).stack().index.get_level_values(0))
Out[205]: 
    col_1  col_2  key
1       2      3    0
10     20     21    0
1       2      3    1
11     22     23    1
2       4      5    2
10     20     21    2
2       4      5    3
11     22     23    3
3       6      7    4
10     20     21    4
3       6      7    5
11     22     23    5
8      16     17    6
10     20     21    6
8      16     17    7
11     22     23    7

答案 1 :(得分:3)

pd.concat

不一定是最有效的...而是聪明的(-:

pd.concat(
    [df.loc[[*pair]].assign(pair=i) for i, pair in enumerate(index)]
).reset_index(drop=True)

    col_1  col_2  pair
0       2      3     0
1      20     21     0
2       2      3     1
3      22     23     1
4       4      5     2
5      20     21     2
6       4      5     3
7      22     23     3
8       6      7     4
9      20     21     4
10      6      7     5
11     22     23     5
12     16     17     6
13     20     21     6
14     16     17     7
15     22     23     7

zip

类似于以上

i_s, j_s = zip(*[(i, j) for j, p in enumerate(index) for i in p])
df.loc[[*i_s]].assign(pair=j_s).reset_index(drop=True)


    col_1  col_2  pair
0       2      3     0
1      20     21     0
2       2      3     1
3      22     23     1
4       4      5     2
5      20     21     2
6       4      5     3
7      22     23     3
8       6      7     4
9      20     21     4
10      6      7     5
11     22     23     5
12     16     17     6
13     20     21     6
14     16     17     7
15     22     23     7

答案 2 :(得分:2)

设置

m = pd.MultiIndex(levels=[[1, 2, 3, 8], [10, 11]],
       labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]])

您可以对基础numpy数组进行操作

a = np.stack(m.values)
v = df.values
res = v[a]
c = res.shape[-1]

u = pd.DataFrame(res.reshape(-1, df.shape[1]), columns=df.columns)
u['pair'] = np.repeat(np.arange(u.shape[0] // c), c)

    col_1  col_2  pair
0       2      3     0
1      20     21     0
2       2      3     1
3      22     23     1
4       4      5     2
5      20     21     2
6       4      5     3
7      22     23     3
8       6      7     4
9      20     21     4
10      6      7     5
11     22     23     5
12     16     17     6
13     20     21     6
14     16     17     7
15     22     23     7

说明

当我们使用MultiIndex的所有组合为DataFrame的值建立索引时,不仅获得正确的映射,而且在输出的维度中将分组的行聚集在一起。我们可以使用此形状在以后推断pair列。

print(v[a])

array([[[ 2,  3],
        [20, 21]],

       [[ 2,  3],
        [22, 23]],

       [[ 4,  5],
        [20, 21]],

       [[ 4,  5],
        [22, 23]],

       [[ 6,  7],
        [20, 21]],

       [[ 6,  7],
        [22, 23]],

       [[16, 17],
        [20, 21]],

       [[16, 17],
        [22, 23]]], dtype=int64)