在单个数据框中显示所有匹配的对 - Python Record Linkage

我有一个熊猫 MultiIndex 对象:


In [0]: index

Out[0]: 

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]])

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


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


In [1]: df

Out[1]: 

     col_1   col_2

0        0       1

1        2       3

2        4       5

3        6       7

4        8       9

5       10      11

6       12      13

7       14      15

8       16      17

9       18      19

10      20      21

11      22      23

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


In [2]: result

Out[2]: 

    col_1   col_2     pair

        2       3        0

       20      21        0

        2       3        1

       22      23        1

        4       5        2

       20      21        2

        4       5        3

       22      23        3

        6       7        4

       20      21        4

        6       7        5

       22      23        5

       16      17        6

       20      21        6

       16      17        7

       22      23        7

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


提前致谢


慕容森
浏览 223回答 3
3回答

杨魅力

stack与iloc或一起使用reindexdf.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  key1       2      3    010     20     21    01       2      3    111     22     23    12       4      5    210     20     21    22       4      5    311     22     23    33       6      7    410     20     21    43       6      7    511     22     23    58      16     17    610     20     21    68      16     17    711     22     23    7

青春有我

pd.concat不一定是最有效的……但很聪明 (-:pd.concat(    [df.loc[[*pair]].assign(pair=i) for i, pair in enumerate(index)]).reset_index(drop=True)    col_1  col_2  pair0       2      3     01      20     21     02       2      3     13      22     23     14       4      5     25      20     21     26       4      5     37      22     23     38       6      7     49      20     21     410      6      7     511     22     23     512     16     17     613     20     21     614     16     17     715     22     23     7zip与上面类似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  pair0       2      3     01      20     21     02       2      3     13      22     23     14       4      5     25      20     21     26       4      5     37      22     23     38       6      7     49      20     21     410      6      7     511     22     23     512     16     17     613     20     21     614     16     17     715     22     23     7

幕布斯7119047

设置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.valuesres = 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  pair0       2      3     01      20     21     02       2      3     13      22     23     14       4      5     25      20     21     26       4      5     37      22     23     38       6      7     49      20     21     410      6      7     511     22     23     512     16     17     613     20     21     614     16     17     715     22     23     7解释当我们使用 的所有组合索引 DataFrame 的值时,我们MultiIndex不仅获得了正确的映射,而且我们将分组的行在输出的一个维度中组合在一起。稍后我们可以使用这个形状来推断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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python