如何使用numpy广播在条件下组合多索引列值
发布时间:2020-12-20 12:13:30 所属栏目:Python 来源:网络整理
导读:我有一个问题,我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
我有一个问题,我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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |