1

次のDataFrameような列があります。

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

さまざまな A 列と B 列をそれぞれ 1 つの列に「折りたたんで」、それらの平均値を計算したいと思います。要するに、操作の最後に次のようになります。

["A", "B"]

ここで、「A」はすべての「A」列の列方向の平均であり、「B」はすべての「B」列の平均です。

私が理解している限り、groupbyこのタスクには適していないか、間違って使用している可能性があります:

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

を使用するaxis=1と、mean() を呼び出したときに得られるのは空の DataFrame だけです。そうでない場合は、目的の効果が得られません。別の DataFrame を作成して、反復によって手段を埋めることは避けたいと思います (たとえば、手段を個別に計算してから のように追加するなどnew_df["A"] = mean_a)。これに対する効率的な解決策はありますか?

4

2 に答える 2

3

行ごとの手段を指定mean()する引数を受け入れる組み込み関数を利用したいと考えています。axis必要なさまざまな手段に対する特定の列名規則を知っているので、以下のコード例を使用して非常に効率的に行うことができます。ここでは、既存のデータを実際に破壊するのではなく、2 つの追加の列を作成することにしました。これらの新しい列を新しいデータ フレームに入れることもできました。それはあなたのニーズが何であるか、そしてあなたにとって何が便利かによって異なります. どちらの場合でも同じ基本的な考え方が機能します。

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
于 2012-07-02T02:59:34.797 に答える
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]もう少し頑丈だと思います。

于 2012-06-29T16:18:18.323 に答える