7

Pandas groupby を使用するのに苦労しています。私は次のものを持っているとしましょう:

df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A', 'C'], 'Y' : [1, 2, 3, 4, 5]})

groupby 操作を実行して、すべての A をグループ化し、A 以外をすべてグループ化したいので、次のようにします。

df2.groupby(<something>).groups
Out[1]: {'A': [2, 3], 'not A': [0, 1, 4]}

関数を送信するなどのことを試しましたが、何も機能しませんでした。これは可能ですか?

どうもありがとう。

4

3 に答える 3

3

@Dan Allan の回答を少し拡張するには、グループに名前を付けたい場合は、numpy.where()を使用してマッピング配列を作成できます。

>>> df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A', 'C'], 'Y' : [1, 2, 3, 4, 5]})
>>> m = np.where(df2['X'] == 'A', 'A', 'not A')
>>> df2.groupby(m).groups
{'A': [2, 3], 'not A': [0, 1, 4]}

df2['X'] が A または B のいずれかであるかどうかを確認するには、df2['X'].isin(['A', 'B'])代わりに を使用できます。df2['X'] == 'A'np.logical_or(df2['X'] == 'A', df2['X'] == 'B')

于 2013-10-29T08:02:11.357 に答える
1

はい、groupby 操作はおそらく最も有用であり、私の意見ではドキュメントで説明されている最悪のものです。

関数でこれをやろうと決めたとき、あなたは何かに取り組んでいたと思います。私にとっては、関数は抽象的であり、何をしているのかを変更したいがパラメータを変更したい場合は、何度も何度も使用できるため、これが最良の方法です。ダン・アランが提供した答えは、間違いなく私が進める方法であり、最もエレガントですが、参考までに、これは関数を使用してやりたいことを達成する方法です。

def GroupFunc(x, df, col, Value):
    if df[col][x] == Value:
        return "Group 1" 
    else:
        return "Group 2"

DFGrouped = df2.groupby(lambda x: GroupFunc(x, df2, 'X', 'A'))

理解しておくべきことは、グループ キーとして渡される関数は、インデックス値ごとに 1 回呼び出され、戻り値がグループ名として使用されるということです。したがって、この例では、関数を呼び出すとき x はインデックス値であり、残りの引数は、関心のあるデータフレーム、操作している列、およびテストする値です。

上記のすべては、無名関数を使用して 1 行で実現することもできることに注意してください。

DFGrouped = df2.groupby(lambda x: 'Group 1' if df2.X[x] == 'A' else 'Group 2')

お役に立てれば

于 2013-10-29T05:47:24.893 に答える