3

次のように、データフレームをその列のいずれかでグループ化しています (irisデータセットの例):

grouped_iris = iris.groupby(by="Name")

の列のサブセットで特定のことを行うグループごとに関数を適用したいと思いますgrouped_iris。各グループ ( の各値Name) を合計PetalLengthPetalWidth、それを という新しい列に入れる関数をどのように適用できますSumLengthWidthか? agg次のように、グループごとにすべての列を合計できることを知っています。

grouped_iris.agg(sum)

しかし、私が探しているのは、これにひねりを加えたものです。列ごとに特定のすべてのエントリを合計するのではなく、グループごとNameに列のサブセット ( ) だけを合計したいのです。ありがとう。SepalWidth, SepalLengthName

4

2 に答える 2

2

これはやや洗練されていないように見えますが、仕事はします:

grouped_iris[['PetalLength', 'PetalWidth']].sum().sum(axis=1)
于 2013-02-24T17:46:46.293 に答える
2

集計値が必要なのか (この場合、Andy のソリューションが必要なのか)、それとも元のデータフレームに変換したいのかわかりません。後者の場合は、使用できますtransform

In [33]: cols = ['PetalLength', 'PetalWidth']

In [34]: transformed = grouped_iris[cols].transform(sum).sum(axis=1)

In [35]: iris['SumLengthWidth'] = transformed

In [36]: iris.head()
Out[36]: 
   SepalLength  SepalWidth  PetalLength  PetalWidth         Name  SumLengthWidth
0          5.1         3.5          1.4         0.2  Iris-setosa            85.4
1          4.9         3.0          1.4         0.2  Iris-setosa            85.4
2          4.7         3.2          1.3         0.2  Iris-setosa            85.4
3          4.6         3.1          1.5         0.2  Iris-setosa            85.4
4          5.0         3.6          1.4         0.2  Iris-setosa            85.4

編集:一般的なケースの例

一般に、 dataframe の場合、 groupbydfを集計するとsum、各グループの合計が得られます

In [47]: df
Out[47]: 
  Name  val1  val2
0  foo     6     3
1  bar    17     4
2  foo    16     6
3  bar     7     3
4  foo     6    13
5  bar     7     1

In [48]: grouped = df.groupby('Name')

In [49]: grouped.agg(sum)
Out[49]: 
      val1  val2
Name            
bar     31     8
foo     28    22

あなたの場合、これらを行全体で合計することに興味があります。

In [50]: grouped.agg(sum).sum(axis=1)
Out[50]: 
Name
bar     39
foo     50

しかし、それでは 2 つの数字しか得られません。各グループに 1 つ。一般に、これらの 2 つの数値を元のデータフレームに投影する場合は、次を使用しますtransform

In [51]: grouped.transform(sum)
Out[51]: 
   val1  val2
0    28    22
1    31     8
2    28    22
3    31     8
4    28    22
5    31     8

これらの値が によって生成された値とまったく同じであることに注意してくださいaggただし、元の と同じ次元を持っていdfます。行 [0, 2, 4] と [1, 3, 5] は同じグループであるため、他のすべての値がどのように繰り返されるかも注目してください。あなたの場合、2 つの値の合計が必要なため、これを行全体で合計します。

In [52]: grouped.transform(sum).sum(axis=1)
Out[52]: 
0    50
1    39
2    50
3    39
4    50
5    39

これで、元のデータフレームと同じ長さのシリーズが作成されたので、それを列として割り当てることができます (または、好きなことを行うことができます)。

In [53]: df['val1 + val2 by Name'] = grouped.transform(sum).sum(axis=1)

In [54]: df
Out[54]: 
  Name  val1  val2  val1 + val2 by Name
0  foo     6     3                   50
1  bar    17     4                   39
2  foo    16     6                   50
3  bar     7     3                   39
4  foo     6    13                   50
5  bar     7     1                   39
于 2013-02-24T17:55:52.340 に答える