Python: Pandas Dataframe 如何将整个列与标量相乘
Python: Pandas Dataframe how to multiply entire column with a scalar
如何将数据框给定列的每个元素与标量相乘?
(我试过寻找 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
注意:如果可能的话,我不想遍历数据框并做这样的事情......因为我认为对整个列的任何标准数学运算都应该是可能的w/o必须写一个循环:
for idx, row in df.iterrows():
df.loc[idx, 'quantity'] *= -1
编辑:
我是 运行 0.16.2
的 Pandas
完整跟踪:
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
尝试df['quantity'] = df['quantity'] * -1
。
尝试使用应用功能。
df['quantity'] = df['quantity'].apply(lambda x: x*-1)
这是经过一番研究后的答案:
df.loc[:,'quantity'] *= -1 #seems to prevent SettingWithCopyWarning
有点旧,但我仍然收到相同的 SettingWithCopyWarning。这是我的解决方案:
df.loc[:, 'quantity'] = df['quantity'] * -1
注意:对于使用 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
我使用 Pandas 0.22 收到此警告。您可以使用 assign 方法非常 显式避免这种情况:
df = df.assign(quantity = df.quantity.mul(-1))
较新的 pandas 版本具有 pd.DataFrame.multiply 功能。
df['quantity'] = df['quantity'].multiply(-1)
游戏有点晚了,但对于未来的搜索者来说,这也应该有效:
df.quantity = df.quantity * -1
您可以使用要为
应用乘法的列的索引
df.loc[:,6] *= -1
这会将索引为 6 的列乘以 -1。
您收到错误的真正问题不是您的代码有任何问题:您可以使用 iloc
、loc
或 apply
,或者*=
,其中另一个可能有效。
您遇到的真正问题是您创建 df DataFrame 的方式。很可能你在没有使用 .copy().
的情况下将 df 创建为另一个 DataFrame 的切片。将 df 创建为另一个 DataFrame 的切片的正确方法是 df = original_df.loc[some slicing].copy()
。
问题已在您收到的错误消息“SettingWithCopyWarning:
试图在 DataFrame 的切片副本上设置一个值。
尝试使用 .loc[row_indexer,col_indexer] = value
您也会在最新版本的 pandas 中收到相同的消息。
每当您收到此类错误消息时,您应该始终检查您是如何创建 DataFrame 的。您可能忘记了 .copy()
也可以使用 .iloc
的数字索引。
df.iloc[:,0] *= -1
如何将数据框给定列的每个元素与标量相乘? (我试过寻找 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
注意:如果可能的话,我不想遍历数据框并做这样的事情......因为我认为对整个列的任何标准数学运算都应该是可能的w/o必须写一个循环:
for idx, row in df.iterrows():
df.loc[idx, 'quantity'] *= -1
编辑:
我是 运行 0.16.2
的 Pandas
完整跟踪:
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
尝试df['quantity'] = df['quantity'] * -1
。
尝试使用应用功能。
df['quantity'] = df['quantity'].apply(lambda x: x*-1)
这是经过一番研究后的答案:
df.loc[:,'quantity'] *= -1 #seems to prevent SettingWithCopyWarning
有点旧,但我仍然收到相同的 SettingWithCopyWarning。这是我的解决方案:
df.loc[:, 'quantity'] = df['quantity'] * -1
注意:对于使用 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
我使用 Pandas 0.22 收到此警告。您可以使用 assign 方法非常 显式避免这种情况:
df = df.assign(quantity = df.quantity.mul(-1))
较新的 pandas 版本具有 pd.DataFrame.multiply 功能。
df['quantity'] = df['quantity'].multiply(-1)
游戏有点晚了,但对于未来的搜索者来说,这也应该有效:
df.quantity = df.quantity * -1
您可以使用要为
应用乘法的列的索引df.loc[:,6] *= -1
这会将索引为 6 的列乘以 -1。
您收到错误的真正问题不是您的代码有任何问题:您可以使用 iloc
、loc
或 apply
,或者*=
,其中另一个可能有效。
您遇到的真正问题是您创建 df DataFrame 的方式。很可能你在没有使用 .copy().
的情况下将 df 创建为另一个 DataFrame 的切片。将 df 创建为另一个 DataFrame 的切片的正确方法是 df = original_df.loc[some slicing].copy()
。
问题已在您收到的错误消息“SettingWithCopyWarning:
试图在 DataFrame 的切片副本上设置一个值。
尝试使用 .loc[row_indexer,col_indexer] = value
您也会在最新版本的 pandas 中收到相同的消息。
每当您收到此类错误消息时,您应该始终检查您是如何创建 DataFrame 的。您可能忘记了 .copy()
也可以使用 .iloc
的数字索引。
df.iloc[:,0] *= -1