的Python GROUPBY申请恢复奇数据帧

的Python GROUPBY申请恢复奇数据帧

问题描述:

这里是我的功能:的Python GROUPBY申请恢复奇数据帧

def calculate_employment_two_digit_industry(df): 
    df['intersection'] = df['racEmpProb'] * df['wacEmpProb'] 
    df['empProb'] = df['intersection']/df['intersection'].sum() 
    df['newEmp'] = df['empProb'] * df['Emp'] 

    df = df[['h_zcta', 'w_zcta', 'indID', 'newEmp', 'empProb']] 
    df.rename(columns = {'newEmp' : 'Emp'}, inplace = True) 

    return df 

这里是我的测试:

def test_calculate_employment_two_digit_industry(): 
    testDf = pandas.DataFrame({'h_zcta'  : [99163, 99163, 99163, 99163], 
          'w_zcta'  : [83843, 83843, 83843, 83843], 
          'indID'  : [11, 21, 22, 42], 
          'Emp'  : [20, 20, 40, 40], 
          'racEmpProb' : [0.5, 0.5, 0.6, 0.4], 
          'wacEmpProb' : [0.7, 0.3, 0.625, 0.375], 
          '1_digit' : [1, 1, 2, 2]}) 

    expectedDf = pandas.DataFrame({'h_zcta' : [99163, 99163, 99163, 99163], 
          'w_zcta' : [83843, 83843, 83843, 83843], 
          'indID' : [11, 21, 22, 42], 
          'Emp'  : [14, 6, 28.5716, 11.4284], 
          'empProb' : [0.7, 0.3, 0.71429, 0.28571]}) 

    expectedDf = expectedDf[['h_zcta', 'w_zcta', 'indID', 'Emp', 'empProb']] 

    final = testDf.groupby(['h_zcta', 'w_zcta', '1_digit'])\ 
       .apply(calculate_employment_two_digit_industry).reset_index() 

    assert expected.equals(final) 

正如你可以在测试我有看到预期的函数返回。除了我可以修复的代码中潜在的数学错误,这里是返回的数据框,我如何才能返回正常的数据框(如果normal是正确的术语),即没有图层只是列和行?

     h_zcta w_zcta indID Emp empProb 
h_zcta w_zcta 1_digit           
99163 83843 1  0 99163 83843  11 14.0  0.7 
         1 99163 83843  21 6.0  0.3 
       2  0 99163 83843  22 28.0  0.7 
         1 99163 83843  42 12.0  0.3 

在此先感谢您。

你需要.reset_index(drop=True)

即:

final = testDf.groupby(['h_zcta', 'w_zcta', '1_digit']).apply(
    calculate_employment_two_digit_industry).reset_index(drop=True) 

>>> final.index 
RangeIndex(start=0, stop=4, step=1) 
+0

另外,我相信'testDF.groupby([...],as_index = FALSE)'可能同样可行。 –

+0

,它仍然为'final.index'提供'MultiIndex(...)' – zemekeneng

+0

谢谢你的完美工作。如果你有时间,你会介意回答为什么会发生这种情况(groupby期间发生了什么,并申请创建MultiIndex)? –