Python groupby应用返回奇数数据帧
以下是我的功能:Python groupby应用返回奇数数据帧,python,pandas,group-by,Python,Pandas,Group By,以下是我的功能: 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_zct
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)
正如您在测试中看到的,我得到了我期望函数返回的结果。除了代码中我可以修复的潜在数学错误之外,这里是返回的数据帧,我如何让它返回一个正常的数据帧(如果正常是正确的术语),即没有层,只有列和行
hzctawzctaindid Emp Emp prob
h_zcta w_zcta 1位
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
提前谢谢。您需要
。重置索引(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提供了multi-index(…)
,谢谢你的完美工作。如果您有时间,您是否介意回答为什么会发生这种情况(groupby和apply创建多索引期间会发生什么情况)?据我所知,groupby
创建一个DataFrameGroupBy
对象,然后.apply()
在DataFrameGroupBy
上迭代,为每个组创建一个新的DataFrame
,其中包含一个MultiIndex
。.apply()
还将函数应用于新的数据帧中的每一行。如果你.groupby().apply()
,我想你总是会得到一个多索引。