【问题标题】:How to create pandas dataframe based on multi-index column values如何基于多索引列值创建熊猫数据框
【发布时间】:2019-02-19 03:05:43
【问题描述】:

我尝试根据多索引列值创建新的数据框列

这是原始数据框

import pandas as pd
b = pd.DataFrame({'i':[1,1,1,2,2],'i2':[1,2,3,1,2],'v':[0.1,0.7,0.2,0.12,0.88] })
b.set_index(['i','i2'], inplace=True)

我想创建两个新列,“res1”和“res2”。两者都是从 0.0 到 1.0。

对于每个索引“i”记录,从最小的开始到最大的“i2”值。

“res1”值从 0.0 开始,第二个最小值等于之前的“v”值加上“res1”值。

“res2”值从最小的“v”值开始,每次都加上“v”值

我觉得这里很难解释,所以我创建了两个数据框。 b_expect 作为最终预期结果,b_explain 作为结果生成方式的解释。

b_explain = pd.DataFrame({'i':[1,1,1,2,2],'i2':[1,2,3,1,2],'v':[0.1,0.7,0.2,0.12,0.88], 'res1':[0, '0.1=0.0+0.1', '0.8=0.1+0.7',0.0,'0.12=0.0+0.12'],'res2':['0.1=0.0+0.1','0.8=0.1+0.7','1.0=0.8+0.2','0.12=0.0+0.12','1.0=0.12+0.88']})
b_expect = pd.DataFrame({'i':[1,1,1,2,2],'i2':[1,2,3,1,2],'v':[0.1,0.7,0.2,0.12,0.88], 'res1':[0, 0.1, 0.8,0.0,0.12],'res2':[0.1,0.8,1.0,0.12,1.0]})
b_explain.set_index(['i', 'i2'], inplace=True)
b_expect.set_index(['i', 'i2'], inplace=True)

b
Out[1]: 
         v
i i2      
1 1   0.10
  2   0.70
  3   0.20
2 1   0.12
  2   0.88

b_explain
Out[2]: 
         v           res1           res2
i i2                                    
1 1   0.10              0    0.1=0.0+0.1
  2   0.70    0.1=0.0+0.1    0.8=0.1+0.7
  3   0.20    0.8=0.1+0.7    1.0=0.8+0.2
2 1   0.12              0  0.12=0.0+0.12
  2   0.88  0.12=0.0+0.12  1.0=0.12+0.88

b_expect
Out[3]: 
         v  res1  res2
i i2                  
1 1   0.10  0.00  0.10
  2   0.70  0.10  0.80
  3   0.20  0.80  1.00
2 1   0.12  0.00  0.12
  2   0.88  0.12  1.00

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    假设您没有其他 NaN 值:

    b['res1'] = b.groupby(level=0).cumsum()
    b['res2'] = b.groupby(level=0).cumsum().shift(1)['v'].fillna(0)
    

    【讨论】:

    • 感谢您的解决方案,这与我想要的非常接近,我已编辑您的解决方案以使其正确。
    猜你喜欢
    • 2020-05-25
    • 2016-06-16
    • 2016-01-13
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2020-11-21
    • 2023-02-01
    相关资源
    最近更新 更多