猿问

从另一个多索引数据帧的索引填充数据帧列的矢量化方法?

假设我有一个多索引数据框df1:


        x   y

i0  i1      

aaa a   1   6

    b   2   5

    c   3   4

bbb x   4   3

    y   5   2

    z   6   1

使用第二个数据框df2:


       foo         bar      cat

0   0.925481    0.682102    aaa

1   0.620557    0.375114    aaa

2   0.788425    0.746436    bbb

3   0.247594    0.902258    aaa

4   0.146786    0.048585    bbb

5   0.256904    0.327165    bbb

我想使用第一个数据帧的二级索引列表将第二个数据帧中的列填充df2为数组,如下所示:


       foo         bar      cat      catlist

0   0.925481    0.682102    aaa   ['a','b','c']

1   0.620557    0.375114    aaa   ['a','b','c']

2   0.788425    0.746436    bbb   ['x','y','z']

3   0.247594    0.902258    aaa   ['a','b','c']

4   0.146786    0.048585    bbb   ['x','y','z']

5   0.256904    0.327165    bbb   ['x','y','z']

我可以通过迭代(缓慢地)来做到这一点,但是应该如何使用矢量化 pandas 方法来完成此操作?


迭代使用apply:


def iterate(row):

    return list(df1.loc[row['cat']].index.get_level_values(0))


df2['catlist'] = df2.apply(iterate, axis=1)


千巷猫影
浏览 81回答 1
1回答

慕盖茨4494581

您可以使用 将MultiIndex转换为数据帧pd.MultiIndex.to_frame,然后使用 gropuby 并使用GroupBy.agg来列出。现在映射在pd.Series.mapmapping = df1.index.to_frame(index=False).groupby("i0")["i1"].agg(list)df2["catlist"] = df2["cat"].map(mapping)        foo       bar  cat    catlist0  0.925481  0.682102  aaa  [a, b, c]1  0.620557  0.375114  aaa  [a, b, c]2  0.788425  0.746436  bbb  [x, y, z]3  0.247594  0.902258  aaa  [a, b, c]4  0.146786  0.048585  bbb  [x, y, z]5  0.256904  0.327165  bbb  [x, y, z]
随时随地看视频慕课网APP

相关分类

Python
我要回答