Python 迭代行时不保存更改
假设我有以下数据帧:Python 迭代行时不保存更改,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有以下数据帧: StG 0 1 2 0.5 1 3 1 0.33 2 4 4 1 现在我想将变量Shots乘以一个随机值(代码中的乘数),并重新聚集StG变量,该变量只是Shots/Goals,我使用的代码是: for index,row in df.iterrows(): multiplier = (np.random.randint(1,5+1)) row['Shots'] *= multiplier
StG
0 1 2 0.5
1 3 1 0.33
2 4 4 1
现在我想将变量Shots乘以一个随机值(代码中的乘数),并重新聚集StG变量,该变量只是Shots/Goals,我使用的代码是:
for index,row in df.iterrows():
multiplier = (np.random.randint(1,5+1))
row['Shots'] *= multiplier
row['StG']=float(row['Shots'])/float(row['Goals'])
然后我保存了.csv文件,它与原始文件相同,因此在for之后,我只需使用print(df)即可获得:
Shots Goals StG
0 1 2 0.5
1 3 1 0.33
2 4 4 1
如果我在for迭代期间每行打印一个值,我会看到它们发生了变化,但它们好像没有保存在df中
我认为这是因为我只是访问值,而不是实际的数据帧
我应该添加类似df.row[]的内容,但它返回的DataFrame没有row属性
谢谢你的帮助
____编辑____
for index,row in df.iterrows():
multiplier = (np.random.randint(1,5+1))
row['Impresions']*=multiplier
row['Clicks']*=(np.random.randint(1,multiplier+1))
row['Ctr']= float(row['Clicks'])/float(row['Impresions'])
row['Mult']=multiplier
#print (row['Clicks'],row['Impresions'],row['Ctr'],row['Mult'])
主要的条件是点击次数不能超过印象次数
然后我重新计算点击率/点击率之间的比率
我不确定将整列相乘是否是保持每行Impr>=单击的最佳选择,因此我逐行查看了pandas docs about
ItErrors()
:
您不应修改正在迭代的内容。这并不能保证在所有情况下都有效。根据数据类型的不同,迭代器返回的是一个副本而不是视图,对其进行写入将无效
好消息是您不需要迭代行-您可以对列执行以下操作:
# 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']
定义一个返回序列的函数:
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)
只要新列值仅依赖于同一行中的其他值,这种方法就非常灵活。请参阅相关:Hello sgrg,我试图提出一个简单的示例。我会记住在发布问题之前检查文档。现在想象一下,我也想乘以列快照,但逻辑是快照的数量永远不能大于同一行中的目标,我每行迭代一次,使golas的乘数始终在0和同一行的目标数量之间,以确保相同的条件。给我5分钟,我会添加原始代码。你问的问题不太清楚,更新后的问题有不同的示例,但你也可以根据条件筛选列。请参阅示例。此外,最好将此作为新问题发布,以获得更多关注(并链接回此问题以供参考):)