2017-07-26 7 views
2

私は以下のデータフレームを持っています。パンダサブセットデータフレームの逆ストリング列

ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 0|8 2|0 
2 3 DE 2|4 6|6 3|1 
3 4 ES 3|9 1|2 4|2 

アリスとボブの列には文字列値が含まれています。私はこれらの列の文字列を別の列の値を条件にして逆にしたい。例えば、どこ対応する列内の文字列は次のようになり逆転LOC == ES、:

ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 8|0 0|2 
2 3 DE 2|4 6|6 3|1 
3 4 ES 9|3 2|1 2|4 

は、数千行でcsvファイルに一致するすべての行に対してこの操作を実行するための高速な方法はありますか?

ありがとうございます。

+1

あなたの所望のデータが矛盾するを設定した文字列を逆にする方法があることを私の答えで

df['Alice'] = df[['LOC','Alice']].apply(lambda x: x['Alice'][::-1] if x['LOC'] == 'ES' else x['Alice'], axis=1) 

注意あなたの説明、あなたは 'Karen'カラムで文字列を逆にしたいかどうかを明確にすることができますか? – MaxU

+1

これは単なるアリスとボブですか?それともカレンですか? –

答えて

2

使用df.loc文字列がdf.applymapAliceBob列に[::-1]操作を逆に適用し、その後、あなたの行のスライスを取得します。あなたの例の条件のために、次のように

In [533]: df.loc[df['LOC'] == 'ES', ['Alice', 'Bob']] = \ 
       df.loc[df['LOC'] == 'ES', ['Alice', 'Bob']].applymap(lambda x: x[::-1]) 

In [534]: df 
Out[534]: 
    ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 8|0 2|0 
2 3 DE 2|4 6|6 3|1 
3 4 ES 9|3 2|1 4|2 
3
#cols = ['Alice','Bob'] 
In [17]: cols = df.columns.drop(['ID','LOC']) 

In [18]: df.loc[df.LOC=='ES', cols] = df.loc[df.LOC=='ES', cols].apply(lambda x: x.str[::-1]) 

In [19]: df 
Out[19]: 
    ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 8|0 0|2 
2 3 DE 2|4 6|6 3|1 
3 4 ES 9|3 2|1 2|4 
+0

Psst ... 'Karen'を逆にするべきかわかりません) –

+0

@cᴏʟᴅsᴘᴇᴇᴅ、私はOPの希望のデータセットを見て、はいと言うでしょう... – MaxU

2

あなたは.apply()を使用して試みることができる場所の列LOC == 'ES'[::-1]