的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)
另外,我相信'testDF.groupby([...],as_index = FALSE)'可能同样可行。 –
,它仍然为'final.index'提供'MultiIndex(...)' – zemekeneng
谢谢你的完美工作。如果你有时间,你会介意回答为什么会发生这种情况(groupby期间发生了什么,并申请创建MultiIndex)? –