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()
,我想你总是会得到一个
多索引。