如何使用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