55

データ フレームがあり、特定の列 (つまり、特定の列の値) でグループ化したいと考えています。私は次の方法でそれを行うことができます: grouped = df.groupby(['ColumnName']).

この操作の結果は、一部のセルに単一の値ではなく値のセットを含めることができるテーブルとして想像できます。通常のテーブル (つまり、すべてのセルに単一の値が 1 つだけ含まれるテーブル) を取得するには、セル内の値のセットを単一の値に変換するために使用する関数を指定する必要があります。

たとえば、値のセットをそれらの合計、または最小値または最大値で置き換えることができます。私は次の方法でそれを行うことができます:grouped.sum()などgrouped.min()

ここで、さまざまな列にさまざまな関数を使用したいと考えています。次の方法でできることがわかりましたgrouped.agg({'ColumnName1':sum, 'ColumnName2':min})

しかし、諸事情により使えませんfirst。より詳細には、grouped.first()動作しますが、動作grouped.agg({'ColumnName1':first, 'ColumnName2':first})しません。その結果、 NameError: が発生しますNameError: name 'first' is not defined。だから、私の質問は、なぜそれが起こるのか、そしてこの問題を解決する方法です.

追加した

ここで、次の例を見つけました。

grouped['D'].agg({'result1' : np.sum, 'result2' : np.mean})

私も使用する必要があるかもしれnpませんか?しかし、私の場合、python は「np」を認識しません。インポートする必要がありますか?

4

5 に答える 5

58

first問題は、名前を共有するが動作が異なる2つの異なるメソッドがあることだと思います。1つはgroupbyオブジェクト用で、もう1つはSeries / DataFrame用です(時系列を処理するため)。

を使用firstして、DataFrame上でgroupbyメソッドの動作を複製するには(インデックスごとに各グループ(DataFrame / Series)の最初の行を取得します):aggiloc[0]

grouped.agg(lambda x: x.iloc[0])

例えば:

In [1]: df = pd.DataFrame([[1, 2], [3, 4]])

In [2]: g = df.groupby(0)

In [3]: g.first()
Out[3]: 
   1
0   
1  2
3  4

In [4]: g.agg(lambda x: x.iloc[0])
Out[4]: 
   1
0   
1  2
3  4

last同様に、を使用して複製できますiloc[-1]

注:これは列ごとに機能します。

g.agg({1: lambda x: x.iloc[0]})

古いバージョンのパンダでは、irowメソッドを使用できます(たとえばx.irow(0)、以前の編集を参照してください)。


更新されたメモのカップル:

これは、nthgroupbyメソッドを使用して行う方が適切です。groupbyメソッドは、>=0.13よりもはるかに高速です。

g.nth(0)  # first
g.nth(-1)  # last

NaN行のデフォルトの動作は無視されるため、少し注意する必要がありfirstますlast...およびDataFrame groupbysのIIRCは、0.13より前に壊れていました...のdropnaオプションがありますnth

組み込みではなく文字列を使用できます(IIRCパンダはsum組み込みであると認識して適用しますnp.sum):

grouped['D'].agg({'result1' : "sum", 'result2' : "mean"})
于 2013-02-21T12:51:42.893 に答える
30

firstまたはを使用する代わりにlast、メソッドでそれらの文字列表現を使用しますagg。たとえば、OPの場合:

grouped = df.groupby(['ColumnName'])
grouped['D'].agg({'result1' : np.sum, 'result2' : np.mean})

#you can do the string representation for first and last
grouped['D'].agg({'result1' : 'first', 'result2' : 'last'})
于 2016-11-18T19:10:46.457 に答える
0

これが本当に問題なのかどうかはわかりませんが、sum入力minとしていくつかのイテラブルを受け取る Python ビルトインですfirstが、pandas Series オブジェクトのメソッドであるため、名前空間にない可能性があります。さらに、入力として何か他のものを取ります(ドキュメントにはオフセット値が記載されています)。

それを回避する1つの方法は、独自のfirst関数を作成し、入力として Series オブジェクトを取るように定義することだと思います。

def first(Series, offset):
    return Series.first(offset)

またはそのようなもの..

于 2013-02-21T11:53:00.217 に答える