为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2021-10-19 16:34:24
我有一个熊猫 MultiIndex 对象:In [0]: indexOut[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]: dfOut[1]:      col_1   col_20        0       11        2       32        4       53        6       74        8       95       10      116       12      137       14      158       16      179       18      1910      20      2111      22      23我想要的是创建一个新的 DataFrame 来显示上面定义的所有对。看起来像的东西:In [2]: resultOut[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 循环)提前致谢
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

stack与iloc或一起使用reindex


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


查看完整回答
反对 回复 2021-10-19
?
青春有我

TA贡献1784条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-10-19
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

设置


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

解释


当我们使用 的所有组合索引 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)


查看完整回答
反对 回复 2021-10-19
  • 3 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信