Python 计算数据帧中一组列的平均值的最有效方法
我有一个Python 计算数据帧中一组列的平均值的最有效方法,python,pandas,Python,Pandas,我有一个DataFrame,列如下: ["A_1", "A_2", "A_3", "B_1", "B_2", "B_3"] ~/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
DataFrame
,列如下:
["A_1", "A_2", "A_3", "B_1", "B_2", "B_3"]
~/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
我想把不同的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()时,我得到的只是一个空的数据帧,如果没有,我就没有得到想要的效果。我希望避免构建一个单独的数据框架,通过迭代用平均值填充(例如,通过单独计算平均值,然后添加它们,如
new_df[“a”]=mean_a
)。有没有有效的解决方案?我不知道如何提高效率,但我可能会这样做:
["A_1", "A_2", "A_3", "B_1", "B_2", "B_3"]
~/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]
会更健壮一些。我不知道效率,但我可能会这样做:
["A_1", "A_2", "A_3", "B_1", "B_2", "B_3"]
~/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(''u')[0]
会更健壮一些。您希望使用内置的mean()
函数,该函数接受axis
参数来指定行平均值。因为您知道您想要的不同方法的特定列名约定,所以可以使用下面的示例代码非常有效地执行此操作。在这里,我选择只创建两个附加列,而不是实际销毁现有数据。我还可以将这些新列放入新的数据框中;这取决于你的需要和你的方便。同样的基本思想在任何一种情况下都适用
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
您需要使用内置的
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
从我做的初始测试开始,它似乎可以工作,我将在周一检查,当我能够在真实数据上运行它时。对于我的真实数据(有几个组),两个不同的groupby()调用可以很好地解决问题,而另一个解决方案稍微慢一点。从我做的初始测试开始,它似乎可以工作,当我能够在真实数据上运行此功能时,我将在周一返回。对于我的真实数据(有多个组),两个不同的groupby()调用可以很好地解决问题,而另一个解决方案稍微慢一点。也将尝试此功能,看看两个解决方案中有什么是最好的,谢谢。也将尝试此功能,看看两个解决方案中有什么是最好的,谢谢。