在for循环中的pandas中的groupby对象中访问多索引列名

时间:2017-07-10 21:57:39

标签: python pandas

说我有这样的数据框:

df = pd.DataFrame({"name":["ss", "ss", "ss", "xx", "xx", "xx"], "num":[1,1,2,1,1,2], "m":[1,2,3,4,5,6]})

enter image description here

def somefunction(m):
    mean = np.mean(np.array(list(m)))
    return mean

result = []

    for i,group in df.groupby(['name', 'num'], as_index=False):
        row_result = []
        mean = somefunction(group['m'])
        row_result = [group['name'], group['num'], mean ]
        result.append(row_result)


    headers = ['name', 'num', 'm']
    stats1 = pd.DataFrame(result, columns=headers)  
    stats1

使用上面的代码,我得到的数据帧看起来像这样。

enter image description here

但我真正想要的是以下内容:

enter image description here

如果我使用apply来执行此功能,我可以使用reset_index来获取我想要的内容。但我正在计算的工作流程与我在下面给出的示例类似。使用group['name']group['num']会返回整个系列。如何在最终数据框中获取组名和数字?

忽略函数定义(它只是虚拟),我的比计算平均值复杂得多。

1 个答案:

答案 0 :(得分:2)

让我们使用groupbymeanreset_index

df.groupby(['name','num']).mean().reset_index()

输出:

  name  num    m
0   ss    1  1.5
1   ss    2  3.0
2   xx    1  4.5
3   xx    2  6.0

使用您的代码,您可以通过i

获取群组
def somefunction(m):
    mean = np.mean(np.array(list(m)))
    return mean

result = []

for i,group in df.groupby(['name', 'num'], as_index=False):
    row_result = []
    mean = somefunction(group['m'])
    row_result = [i[0], i[1], mean ]
    result.append(row_result)


headers = ['name', 'num', 'm']
stats1 = pd.DataFrame(result, columns=headers)  
stats1

输出:

  name  num    m
0   ss    1  1.5
1   ss    2  3.0
2   xx    1  4.5
3   xx    2  6.0