2015-11-17 14 views
23

データフレームの特定の列の各要素にスカラーを掛けるにはどうすればよいですか?以下のような何か行う (私はSOに見て試してみましたが、適切なソリューションを見つけることができないよう)Python:Pandasデータフレームに列全体にスカラーを掛ける方法

A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

注:可能な場合は、

df['quantity'] *= -1 # trying to multiply each row's quantity column with -1 

は私に警告を与えます私は、データフレームを繰り返し処理し、このようなことをしたくありません。ループ全体を書くことを必要とせずに、標準の数学演算を列全体で行うことができると思います。

for idx, row in df.iterrows(): 
    df.loc[idx, 'quantity'] *= -1 

EDIT

私はパンダ

完全なトレースの0.16.2を実行しています:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    self.obj[item] = s 
+0

'dtype'を使用してその列のタイプをチェックしてください。私はそのエラーを再現することはできません、完全なトレースバックを与えることも良いです。 – Leb

+0

完全なトレースを追加するために編集しました...また、エラーではなく、警告(わかりやすくするために) – labheshr

+0

私はそれがその行以外の何かによって引き起こされていると思います。以前から生成された。あなたが得ているのは、データフレームをスライスすることです。 – Leb

答えて

28

はここで、研究のビットの後に答えます:

df.loc[:,'quantity'] *= -1 #seems to prevent SettingWithCopyWarning 
+0

これはpandas 0.18にSettingWithCopyWarningをスローします。 0。 – kadrach

0

df['quantity'] = df['quantity'] * -1を試してみてください。

+0

これはdf ['quantity'] * = -1と同じではありません(と同じ警告を受け取ります) – labheshr

23

適用機能を使用してみてください。

df['quantity'] = df['quantity'].apply(lambda x: x*-1) 
+0

これはルーピングと比較してかなり優雅ですが、SettingWithCopyWarningをまだ受け取りました – labheshr

2

少し古いが、私はまだ同じSettingWithCopyWarningを得ていました。

df.loc[:, 'quantity'] = df['quantity'] * -1 
9

注:ここに私の解決策だったパンダ0.20.3を使用してそれらのため、その答えを探している、すべてのこれらのオプションはすべての作業

one two three four 
0 5.0 5.0 5.0 5.0 
1 5.0 5.0 5.0 5.0 
2 5.0 5.0 5.0 5.0 
3 5.0 5.0 5.0 5.0 
4 5.0 5.0 5.0 5.0 
になり

df = pd.DataFrame(np.ones((5,4)),columns=['one','two','three','four']) 

df.one*=5 
df.two = df.two*5 
df.three = df.three.multiply(5) 
df['four'] = df['four']*5 

ます