86

如何将数据框给定列的每个元素与标量相乘?(我尝试过查看 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
4

11 回答 11

72

尝试使用应用功能。

df['quantity'] = df['quantity'].apply(lambda x: x*-1)
于 2015-11-18T10:32:59.687 回答
65

注意:对于那些使用 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
于 2017-09-26T23:41:42.240 回答
51

这是经过一番研究后的答案:

df.loc[:,'quantity'] *= -1 #seems to prevent SettingWithCopyWarning 
于 2015-11-18T12:50:22.863 回答
17

更新的 pandas 版本具有 pd.DataFrame.multiply 函数。

df['quantity'] = df['quantity'].multiply(-1)
于 2019-01-14T23:46:57.047 回答
15

为什么您收到错误的真正问题不在于您的代码有什么问题:您可以使用iloc, loc, or apply, or *=,其中另一个可能有效。

您遇到的真正问题是由于您创建 df DataFrame 的方式。很可能您将 df 创建为另一个 DataFrame 的切片而不使用.copy(). 将 df 创建为另一个 DataFrame 的切片的正确方法是df = original_df.loc[some slicing].copy().

您收到的错误消息中已经说明了问题“ 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”
您将收到相同的消息在最新版本的熊猫中也是如此。

每当您收到此类错误消息时,您应该始终检查您是如何创建 DataFrame 的。你有可能忘记了.copy()

于 2019-11-13T02:23:20.653 回答
5

有点老了,但我仍然得到相同的 SettingWithCopyWarning。这是我的解决方案:

df.loc[:, 'quantity'] = df['quantity'] * -1
于 2016-05-18T17:40:04.460 回答
4

试试df['quantity'] = df['quantity'] * -1

于 2015-11-17T22:23:23.537 回答
2

游戏有点晚了,但对于未来的搜索者来说,这也应该有效:

df.quantity = df.quantity  * -1
于 2019-04-30T11:33:15.717 回答
1

我使用 Pandas 0.22 收到了这个警告。您可以通过使用assign方法非常明确地避免这种情况:

df = df.assign(quantity = df.quantity.mul(-1))
于 2018-07-24T14:15:15.923 回答
0

您可以使用要应用乘法的列的索引

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

这会将索引为 6 的列乘以 -1。

于 2019-05-16T03:45:44.363 回答
0

也可以使用带有.iloc.

df.iloc[:,0]  *= -1
于 2020-05-25T14:28:48.257 回答