如何使用groupby方法组合几个(使用切片?)列或行?

时间:2016-10-31 22:42:00

标签: python python-2.7 python-3.x pandas dataframe

我知道使用group by方法可以使用他们的标签组合多个列或行,但如果我想通过计算他们的平均值或标准差来组合多个列,如下所示:

      a1  a2  a3  b1  b2
A1    5   8   9   5   0
A2    0   1   7   6   9
A3    2   4   5   2   4
B1    2   4   7   7   9
B2    1   7   0   6   9 

但这现在可以起作用了:

df.loc[:, 'a'] = df.groupby(['a1': a3']).mean()

它说不能使用“:”,但很难列出所有这样的标签:

df.loc[:, 'a'] = df.groupby(['a1', 'a2',  a3']).mean()

      a  b
A1    x  x
A2    x  x
A3    x  x
B1    x  x
B2    x  x

以同样的方式,行怎么样?

      a1  a2  a3  b1  b2
A      x   x   x   x   x
B      x   x   x   x   x 

那么解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

df = pd.DataFrame([[5,8,9,5,0], [0,1,7,6,9], [2,4,5,2,4], [2,4,7,7,9], [1,7,0,6,9]],
                  index=['A1', 'A2', 'A3', 'B1', 'B2'],
                  columns=['a1', 'a2', 'a3', 'b1', 'b2'])
a_cols = [col for col in df.columns if col.startswith('a')]  # or use any other criterion to select the columns
# e.g. to select columns a51:a100, you can use something like:
# a_cols = [col for col in df.columns if col.startswith('a') and int(col[1:]) >= 51]
df['a'] = df[a_cols].mean(axis=1)
print df

    a1  a2  a3  b1  b2         a 
A1   5   8   9   5   0  7.333333      
A2   0   1   7   6   9  2.666667      
A3   2   4   5   2   4  3.666667      
B1   2   4   7   7   9  4.333333      
B2   1   7   0   6   9  2.666667          

使用groupby

的另一种方法
df.groupby(lambda col: col[0], axis=1).mean()  # or use any other function to select columns
# e.g. to select columns a51:a100, you can use something like:
# lambda col: col if col.startswith('a') and int(col[1:]) >= 51] else 'other'
           a    b
A1  7.333333  2.5
A2  2.666667  7.5
A3  3.666667  3.0
B1  4.333333  8.0
B2  2.666667  7.5

行:

df['prefix'] = df.index.map(lambda x: x[0])  # or any other criterion 
print df

    a1  a2  a3  b1  b2         a prefix
A1   5   8   9   5   0  7.333333      A
A2   0   1   7   6   9  2.666667      A
A3   2   4   5   2   4  3.666667      A
B1   2   4   7   7   9  4.333333      B
B2   1   7   0   6   9  2.666667      B

df.groupby('prefix').mean()              

              a1        a2   a3        b1        b2         a
prefix                                                       
A       2.333333  4.333333  7.0  4.333333  4.333333  4.555556
B       1.500000  5.500000  3.5  6.500000  9.000000  3.500000