2016-03-22 22 views
1

DataFrameで行を選択し、それらの行の列の値を置き換える方法については、多くの質問がありますが、ユースケースは1つありません。パンダの行選択に基づく複数列の置換

df.loc[df.cherry == 'bad', 'apple'] = df.banana * 2 

またはこの2つの列の値を設定します:

df.loc[df.cherry == 'bad', ['apple', 'banana'] = np.nan 
1が別に基づいて単一の列を変更したい場合など DataFrame from this question

In [1]: df 
Out[1]: 
    apple banana cherry 
0  0  3 good 
1  1  4 bad 
2  2  5 good 

を使用して、この作品には、

しかし、これは動作しません:

df.loc[df.cherry == 'bad', ['apple', 'banana'] = [df.banana, df.apple] 

、明らかに右側が3×2であるので、左側が1×2、したがって、エラーメッセージ

ValueError: Must have equal len keys and value when setting with an ndarray 

ありながら、だから私は問題が何であるかを理解しますが、解決策は何ですか?

答えて

2

IIUCあなたが試すことができます:values

df['a'] = df.apple * 3 
df['b'] = df.banana * 2 
print df 
    apple banana cherry a b 
0  0  3 good 0 6 
1  1  4 bad 3 8 
2  2  5 good 6 10 

df[['a', 'b']] = df.loc[df.cherry == 'bad', ['apple', 'banana']] 
print df 
    apple banana cherry a b 
0  0  3 good NaN NaN 
1  1  4 bad 1.0 4.0 
2  2  5 good NaN NaN 

や使用条件を:

df['a'] = df.apple * 3 
df['b'] = df.banana * 2 

df.loc[df.cherry == 'bad', ['apple', 'banana']] = 
df.loc[df.cherry == 'bad', ['a', 'b']].values 
print df 
    apple banana cherry a b 
0  0  3 good 0 6 
1  3  8 bad 3 8 
2  2  5 good 6 10 

元のカラムを持つ別のオプション:

print df[['apple','banana']].shift() * 2 
    apple banana 
0 NaN  NaN 
1 12.0  6.0 
2 2.0  8.0 

df.loc[df.cherry == 'bad', ['apple', 'banana']] = df[['apple','banana']].shift() * 2 
print df 
    apple banana cherry 
0 6.0  3.0 good 
1 12.0  6.0 bad 
2 2.0  5.0 good 
+0

感謝を! 2番目の解決策は私が探していたものです。だから、基本的に私の場合は、 'df.loc [df.cherry == 'bad'、['apple'、 'banana']] = df.loc [df.cherry == 'bad'、['banana '、' apple ']]。values'を使用します。興味深いことに、カラム名を反転しても、 'values'がなければ動作しません。とにかくもう1つの質問:特別なものが必要な場合(例えば 'df.banana * 2')、新しい列を' df'に追加しない方法がありますか?おそらく '適用'と? –

+0

ありがとう、それはよく見えるので、基本的に私はdf.loc [...] = pd.concat([df.banana * 3、df.apple * 2]、axis = 1).values' 。どうやら、値は私が探していた魔法の弾丸でした、ありがとう! –

関連する問題