迭代行时,Pandas不保存更改

时间:2017-04-11 16:05:18

标签: python pandas dataframe

假设我有以下数据框:

a

现在我想将变量Shots乘以一个随机值(代码中的乘数)并重新接收除了Shots / Goals之外的StG变量,我使用的代码是:

Shots Goals StG
0  1     2    0.5
1  3     1    0.33
2  4     4    1

然后我保存了.csv,它与原来的相同,所以在for之后我只是使用print(df)来获取:

for index,row in df.iterrows():
        multiplier = (np.random.randint(1,5+1))
        row['Shots'] *= multiplier
        row['StG']=float(row['Shots'])/float(row['Goals'])

如果我在迭代期间每行打印值行,我看到它们会改变,但就像它们不会保存在df中一样。

我认为这是因为我只是访问了值,而不是实际的数据帧。

我应该添加类似df.row []的内容,但它返回的DataFrame没有row属性。

感谢您的帮助。

____ EDIT ____

Shots Goals StG
0  1     2    0.5
1  3     1    0.33
2  4     4    1 

主要条件是点击次数不能高于展示次数。

然后,我重新计算点击次数/展示次数与点击率之间的比率。

我不确定将整列相乘是否是保持每行Impr> = Clicks的条件的最佳选择,因此我逐行进行

2 个答案:

答案 0 :(得分:1)

关于iterrows()pandas.DataFrame.iterrows

的大熊猫文档

"你永远不应该修改你正在迭代的东西。这并不能保证在所有情况下都有效。根据数据类型,迭代器返回副本而不是视图,写入它将不起作用。"

好消息是你不需要遍历行 - 你可以在列上执行操作:

# Generate an array of random integers of same length as your DataFrame
multipliers = np.random.randint(1, 5+1, size=len(df))

# Multiply corresponding elements from df['Shots'] and multipliers
df['Shots'] *= multipliers

# Recalculate df['StG']
df['StG'] = df['Shots']/df['Goals']

答案 1 :(得分:0)

定义一个返回系列的函数:

def f(x):
    m = np.random.randint(1,5+1)
    return pd.Series([x.Shots * m, x.Shots/x.Goals * m])

将该函数逐行应用于数据框,它将返回另一个数据框,可用于替换现有数据框中的某些列,或在数据框中创建新列

df[['Shots', 'StG']] = df.apply(f, axis=1)

只要新列值仅依赖于同一行中的其他值,此方法就非常灵活。