假设我有以下数据框:
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的条件的最佳选择,因此我逐行进行
答案 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)
只要新列值仅依赖于同一行中的其他值,此方法就非常灵活。