如何制作一个按位置替换熊猫数据框元素的循环

时间:2019-05-06 21:12:50

标签: python pandas

我有一个数据框test,我想更改其元素。具体来说,我想更改数据框的scale列中的值,对除具有最大mPower值的行之外的每一行进行迭代。我希望比例值成为最大的mPower值除以当前行的mPower值。下面是一个小的示例数据框:

test = pd.DataFrame({'psnum':[0,1],'scale':[1,1],'mPower':[4.89842,5.67239]})

我的代码如下:

for index, row in test.iterrows():
    if(test['psnum'][row] != bigps):
        s = morepower/test['mPower'][row]
        test.at[:,'scale'][row] = round(s,2)

其中bigps = 1(即psnum列中具有最大mPower值的值)和morepower = 5.67239(即{{1}中最大的值) mPower数据框的}列)。

运行此代码时,出现错误:“ ValueError:系列的真值不明确。请使用a.empty,a.bool(),a.item(),a.any()或a 。所有()。”我现在已经尝试了几种不同的方法,其中大多数都以错误结尾或在数据框中没有任何更改。

所以最后,我需要这样的test数据框:

test

对此事有任何见识,不胜感激!

3 个答案:

答案 0 :(得分:1)

这正是向量化熊猫非常适合的一种。您可以使用数学运算并立即将其广播到整列中,而不必完全循环。

n - 1

答案 1 :(得分:0)

请尝试以下方法:

for index, row in test.iterrows():
    if(test.iloc[index]['psnum'] != bigps):
        s = morepower/test.iloc[index]['mPower']
        test.at[index,'scale'] = round(s,2)

答案 2 :(得分:0)

不要使用循环。使用vetorized操作。在这种情况下,我使用系列where

test['scale'] = test['scale'].where(test.mPower == test.mPower.max(), test.mPower.max()/test.mPower)

Out[652]:
    mPower  psnum     scale
0  4.89842      0  1.158004
1  5.67239      1  1.000000