2017-07-14 4 views
1

私は自分のデータフレーム内の列値を逆転させたいが、個々の "groupby"レベルでのみ行う。以下は、私は同じ文字A、BまたはCに属する「フリップ」の値にしたい場所を、最小限のデモの例を見つけることができます。パンダは列単位で値を逆にします

df = pd.DataFrame({"group":["A","A","A","B","B","B","B","C","C"], 
        "value": [1,3,2,4,4,2,3,2,5]}) 

    group value 
0  A  1 
1  A  3 
2  A  2 
3  B  4 
4  B  4 
5  B  2 
6  B  3 
7  C  2 
8  C  5 

私の所望の出力は次のようになります。(列が追加の代わりに置き換えられます唯一のいつものように

group value value_desired 
0  A  1    2 
1  A  3    3 
2  A  2    1 
3  B  4    3 
4  B  4    2 
5  B  2    4 
6  B  3    4 
7  C  2    5 
8  C  5    2 

、私は適切なベクトル形式のアプローチを見ていないとき、私はちょうど最終出力のためにループをいじって終わるが、私の現在のコードは私を非常に痛い)簡潔のために、多く:

for i in list(set(df["group"].values.tolist())): 
    reversed_group = df.loc[df["group"]==i,"value"].values.tolist()[::-1] 
    df.loc[df["group"]==i,"value_desired"] = reversed_group 

パンダの達人は、私に道を示してください:)

答えて

3

あなたが感謝transform

In [900]: df.groupby('group')['value'].transform(lambda x: x[::-1]) 
Out[900]: 
0 2 
1 3 
2 1 
3 3 
4 2 
5 4 
6 4 
7 5 
8 2 
Name: value, dtype: int64 

詳細

In [901]: df['value_desired'] = df.groupby('group')['value'].transform(lambda x: x[::-1]) 

In [902]: df 
Out[902]: 
    group value value_desired 
0  A  1    2 
1  A  3    3 
2  A  2    1 
3  B  4    3 
4  B  4    2 
5  B  2    4 
6  B  3    4 
7  C  2    5 
8  C  5    2 
+0

を使用することができます!救助のための変換!私はあなたが知っていることを知っている - あなたはとても親切で、2つを区別するいくつかの問題を抱えているので、私はまた適用スタイルのアプローチを示すことができるか... –

+0

'df.groupby( 'group')['value']。apply (λx:x [:: - 1]) '? – Zero

+0

これは、 'values'とこの行の最後を追加した場合にのみ私にとって役に立ちました。さもなければ、エラー 'TypeError:フレームインデックスを持つ挿入された列の互換性のないインデックス'エラーがスローされました。元のインデックスとの変換の戻り値のシリーズのように見える、マルチテキスト返す適用...とにかくおかげで! –

関連する問題