在Python中循环遍历数据帧

在Python中循环遍历数据帧,python,pandas,Python,Pandas,我有一个数据框,如下所示: c1 c2 c3 c4 c5 c6 c7 0 li 1 2 1 3 2 4 1 qian 2 3 3 5 4 2 2 qian 3 5 4 3 2 4 3 li 5 23 23 2 5 2 4 li 2 5 1 4 2 4 5 zhou 3 5 1 1 1

我有一个数据框,如下所示:

    c1     c2   c3  c4  c5  c6  c7
0   li      1   2   1   3   2   4
1   qian    2   3   3   5   4   2
2   qian    3   5   4   3   2   4
3   li      5   23  23  2   5   2
4   li      2   5   1   4   2   4
5   zhou    3   5   1   1   1   2
我试图创建一个新的列c8,它返回分组平均值。分组方法为:

groupby('c1')['c2'].transform('mean')  ---c2 can be replaced by c3 to c7
我当前的代码如下所示:

lst = [c1, c2, c3, c4,c5, c6, c7]
for i in range(len(lst)):
    res = df.groupby(df['c1'])[i].transform('mean')
    return res
df['c8'] = df[res]

错误表示找不到c1。谁能告诉我如何生成分组平均值并使此循环工作?

这里有几个问题:

  • 您收到的错误是因为您在列表中放入了变量
    lst
    。这些应该是字符串(用引号括起来)

  • 您在迭代
    lst
    的索引,而不是
    lst
    本身的项-例如,对于for循环的每次迭代,您的迭代器
    i
    1
    然后
    2
    然后
    3
    ,而不是
    “c1”

  • for循环
    中有一个
    return
    语句。几乎没有理由在for循环中放入return语句,因为它会完全停止循环

  • 您可以在循环的每次迭代中简单地更新数据帧,而不是将其存储到临时
    res
    变量中

  • for循环方法的工作示例如下所示

    lst = ["c2", "c3", "c4", "c5", "c6", "c7"]
    for column in lst:
        df[column] = df.groupby("c1")[column].transform('mean')
    
    print(df)
         c1        c2  c3        c4  c5  c6        c7
    0    li  2.666667  10  8.333333   3   3  3.333333
    1  qian  2.500000   4  3.500000   4   3  3.000000
    2  qian  2.500000   4  3.500000   4   3  3.000000
    3    li  2.666667  10  8.333333   3   3  3.333333
    4    li  2.666667  10  8.333333   3   3  3.333333
    5  zhou  3.000000   5  1.000000   1   1  2.000000
    
    但更好的是,您可以一次提供所有要计算平均值的列,而无需显式循环:

    lst = ["c2", "c3", "c4", "c5", "c6", "c7"]
    average_df = df.groupby("c1")[lst].transform("mean") 
    
    print(average_df)
             c2    c3        c4   c5   c6        c7
    0  2.666667  10.0  8.333333  3.0  3.0  3.333333
    1  2.500000   4.0  3.500000  4.0  3.0  3.000000
    2  2.500000   4.0  3.500000  4.0  3.0  3.000000
    3  2.666667  10.0  8.333333  3.0  3.0  3.333333
    4  2.666667  10.0  8.333333  3.0  3.0  3.333333
    5  3.000000   5.0  1.000000  1.0  1.0  2.000000
    

    请显示预期输出