Python:Pandas Dataframe如何将整个列与标量相乘

时间:2015-11-17 22:17:58

标签: python pandas chained-assignment

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

注意:如果可能的话,我不想迭代数据帧并执行类似的操作...因为我认为整个列上的任何标准数学运算都应该是可能的,不必编写循环:< / p>

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

编辑

我正在运行Pandas的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

11 个答案:

答案 0 :(得分:41)

尝试使用apply函数。

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

答案 1 :(得分:39)

经过一番研究后,这里得到了答案:

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

答案 2 :(得分:31)

注意:对于那些使用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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

最近的熊猫版本具有pd.DataFrame.multiply函数。

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

答案 5 :(得分:1)

尝试@android:style/Theme.Translucent.NoTitleBar

答案 6 :(得分:1)

我使用Pandas 0.22收到了此警告。您可以使用assign方法非常显式地避免这种情况:

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

答案 7 :(得分:1)

为什么会出现错误的真正问题不是您的代码有什么问题:您可以使用iloclocapply或{{ 1}},他们中的另一个本可以工作。

真正的问题是由于如何创建df DataFrame。最有可能您在不使用*=的情况下将df创建为另一个DataFrame的切片的正确方法是将{d1}作为另一个DataFrame的切片创建df的正确方法。

问题已经在您收到的错误消息中指出:“ SettingWithCopyWarning: 试图在DataFrame的切片副本上设置一个值。 尝试使用.loc [row_indexer,col_indexer] =值代替”
您也会在最新版本的熊猫中收到相同的消息。

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

答案 8 :(得分:0)

游戏晚了一点,但是对于将来的搜索者来说,这也应该起作用:

let total = array.reduce(0, { $0 + $1.driven })

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

还可以在.iloc中使用数字索引。

df.iloc[:,0]  *= -1