计算pandas数据框架中一组列平均值的最有效方法

2024-04-29 12:31:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个DataFrame列如下:

["A_1", "A_2", "A_3", "B_1", "B_2", "B_3"]

我想做的是通过计算它们的平均值来“折叠”单个列中的各个A和B列。简而言之,手术结束后我会得到:

["A", "B"]

其中“A”是所有“A”列的列平均值,“B”是所有“B”列的平均值。

据我所知,groupby不适合此任务,或者我使用它的方式不正确:

grouped = data.groupby([item for item in data if "A" not in item])

如果我使用axis=1,那么在调用mean()时,我得到的只是一个空数据帧,如果没有,我就没有得到所需的效果。我想避免构建一个单独的数据帧,通过迭代来填充means(例如,通过分别计算means,然后像new_df["A"] = mean_a那样添加means)。有什么有效的解决办法吗?


Tags: 数据indataframefordataif方式mean
2条回答

我不知道有效率,但我可能会这样做:

~/coding$ cat colgroup.dat
A_1,A_2,A_3,B_1,B_2,B_3
1,2,3,4,5,6
7,8,9,10,11,12
13,14,15,16,17,18
~/coding$ python
Python 2.7.3 (default, Apr 20 2012, 22:44:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> df = pandas.read_csv("colgroup.dat")
>>> df
   A_1  A_2  A_3  B_1  B_2  B_3
0    1    2    3    4    5    6
1    7    8    9   10   11   12
2   13   14   15   16   17   18
>>> grouped = df.groupby(lambda x: x[0], axis=1)
>>> for i, group in grouped:
...     print i, group
... 
A    A_1  A_2  A_3
0    1    2    3
1    7    8    9
2   13   14   15
B    B_1  B_2  B_3
0    4    5    6
1   10   11   12
2   16   17   18
>>> grouped.mean()
key_0   A   B
0       2   5
1       8  11
2      14  17

我想lambda x: x.split('_')[0]会更健壮一些。

您希望使用接受axis参数的内置mean()函数来指定行方式。由于您知道所需的不同方法的特定列名约定,因此可以使用下面的示例代码非常高效地执行该约定。在这里,我选择只制作两个额外的列,而不是实际销毁现有的数据。我还可以将这些新列放入一个新的数据框架中;这取决于您的需要和方便之处。在这两种情况下,同样的基本思想都会起作用。

In [1]: import pandas

In [2]: dfrm = pandas.DataFrame([[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]], columns = ['A_1', 'A_2', 'A_3', 'B_1', 'B_2', 'B_3'])

In [3]: dfrm
Out[3]: 
   A_1  A_2  A_3  B_1  B_2  B_3
0    1    2    3    4    5    6
1    7    8    9   10   11   12
2   13   14   15   16   17   18

In [4]: dfrm["A_mean"] = dfrm[[elem for elem in dfrm.columns if elem[0]=='A']].mean(axis=1)

In [5]: dfrm
Out[5]: 
   A_1  A_2  A_3  B_1  B_2  B_3  A_mean
0    1    2    3    4    5    6       2
1    7    8    9   10   11   12       8
2   13   14   15   16   17   18      14

In [6]: dfrm["B_mean"] = dfrm[[elem for elem in dfrm.columns if elem[0]=='B']].mean(axis=1)

In [7]: dfrm
Out[7]: 
   A_1  A_2  A_3  B_1  B_2  B_3  A_mean  B_mean
0    1    2    3    4    5    6       2       5
1    7    8    9   10   11   12       8      11
2   13   14   15   16   17   18      14      17

相关问题 更多 >