其他分享
首页 > 其他分享> > 如何使用numpy广播在条件下组合多索引列值

如何使用numpy广播在条件下组合多索引列值

作者:互联网

我有一个问题,我99%肯定有一个numpy广播解决方案,但我无法弄清楚.假设我有以下数据帧:

iterables = [['US', 'DE'], ['A', 'B'], [1, 2, 3, 4, 5]]
idx3 = pd.MultiIndex.from_product(iterables, names=['v1', 'v2', 'v3'])
df3 = pd.DataFrame(data=np.random.randn(20,2), index=idx3)
print(d3)
                c1        c2
v1 v2 v3                    
US A  1  -0.023208 -1.047208
      2   1.128917  0.292252
      3  -0.441574  0.038714
      4   1.057893  1.313874
      5   0.938736 -0.130192
   B  1  -0.479439 -0.311465
      2  -1.730325 -1.300829
      3  -0.112920 -0.269385
      4   1.436866  0.197434
      5   1.659529  2.107746
DE A  1   0.533169 -0.539891
      2   0.225635  1.406626
      3  -0.928966  0.979749
      4  -0.109132  0.862450
      5  -0.481120  1.425678
   B  1   0.592646 -0.573862
      2  -1.135009 -0.365472
      3   0.728357  0.744631
      4   0.156970  0.623244
      5  -0.071628 -0.089194

现在假设我想要列c3,使得c3等于列c1用于索引级别v3的值1-3,并且等于列c2用于索引级别v3的值3-5.

使用应用这应该很容易.

df3.reset_index('v3').apply(lambda df: df.c1 if df.v3<=3 else df.c2, axis=1)

但这是循环每一行并检查条件.
使用布尔索引我可以到这里:

bool1 = df3.loc[df3.index.get_level_values('v3')<=3,['c1']]
bool2 = df3.loc[df3.index.get_level_values('v3')>3,['c2']]

print bool1
                c1
v1 v2 v3          
US A  1  -0.023208
      2   1.128917
      3  -0.441574
   B  1  -0.479439
      2  -1.730325
      3  -0.112920
DE A  1   0.533169
      2   0.225635
      3  -0.928966
   B  1   0.592646
      2  -1.135009
      3   0.728357

print bool2
                c2
v1 v2 v3          
US A  4   1.313874
      5  -0.130192
   B  4   0.197434
      5   2.107746
DE A  4   0.862450
      5   1.425678
   B  4   0.623244
      5  -0.089194

但无法弄清楚如何在原始数据框中重新获得此信息.我觉得我基本上都在那里,但一直跑到死路.

解决方法:

根据您的代码

df3['c3']=pd.concat([bool1.rename(columns={'c1':'c3'}),bool2.rename(columns={'c2':'c3'})])

这就是我们通常做的事情

df3['c3']=np.where(df3.index.get_level_values('v3')<3,df3.c1,df3.c2)
df3
Out[1124]: 
                c1        c2        c3
v1 v2 v3                              
US A  1   0.141297  0.304322  0.141297
      2  -0.532937  0.599611 -0.532937
      3   0.480130 -0.601851 -0.601851
      4  -0.208570  0.428122  0.428122
      5  -0.775055 -1.842595 -1.842595
   B  1  -0.985807 -0.259167 -0.985807
      2  -0.211140  0.514273 -0.211140
      3   0.006876  0.261158  0.261158
      4  -1.001227  0.069682  0.069682
      5  -0.937359 -0.364904 -0.364904
DE A  1  -0.510380 -1.815965 -0.510380
      2   0.730677  1.901079  0.730677
      3  -0.439140  1.068193  1.068193
      4   0.183268  1.879705  1.879705
      5  -1.455026  0.958647  0.958647
   B  1   1.491328  2.139492  1.491328
      2  -0.035495  1.487377 -0.035495
      3  -0.503681  0.837837  0.837837
      4  -2.320546  0.683476  0.683476
      5  -2.407492  0.962752  0.962752

标签:python,pandas,numpy,numpy-broadcasting
来源: https://codeday.me/bug/20190716/1474241.html