web-dev-qa-db-ja.com

Python:Pandas Dataframe列全体にスカラーを乗算する方法

データフレームの特定の列の各要素にスカラーを乗算するにはどうすればよいですか? (私はSOを探してみましたが、正しい解決策を見つけることができないようです)

次のようなことをする:

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

私に警告を与えます:

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

注:可能であれば、データフレームを繰り返し処理するのではなく、次のようなことを行います...列全体での標準的な数学演算は、ループを書かなくても可能だと思います:

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

編集

パンダの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
47
labheshr

少し調べた後の答えは次のとおりです。

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

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

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

注:pandas 0.20.3以降を使用していて、答えを探している場合、これらのオプションはすべて機能します。

df = pd.DataFrame(np.ones((5,6)),columns=['one','two','three',
                                       'four','five','six'])
df.one *=5
df.two = df.two*5
df.three = df.three.multiply(5)
df['four'] = df['four']*5
df.loc[:, 'five'] *=5
df.iloc[:, 5] = df.iloc[:, 5]*5

結果として

   one  two  three  four  five  six
0  5.0  5.0    5.0   5.0   5.0  5.0
1  5.0  5.0    5.0   5.0   5.0  5.0
2  5.0  5.0    5.0   5.0   5.0  5.0
3  5.0  5.0    5.0   5.0   5.0  5.0
4  5.0  5.0    5.0   5.0   5.0  5.0
37
DJK

最新のpandasバージョンには、pd.DataFrame.multiply関数があります。

df['quantity'] = df['quantity'].multiply(-1)
5
stephenb

少し古いですが、私はまだ同じSettingWithCopyWarningを取得していました。ここに私の解決策がありました:

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

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

1
GiannisIordanou

Pandas 0.22を使用してこの警告が表示されました。これを避けるには、 assign メソッドを使用して明示的にveryにすることで:

df = df.assign(quantity = df.quantity.mul(-1))
1
Michael Rice

乗算を適用する列のインデックスを使用できます

df.loc[:,6] *= -1

これにより、インデックス6の列に-1が乗算されます。

0
DINA TAKLIT

ゲームに少し遅れましたが、将来の検索者にとっては、これも機能するはずです:

df.quantity = df.quantity  * -1
0
Jack Fleeting