Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代行时不保存更改_Python_Pandas_Dataframe - Fatal编程技术网

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分钟,我会添加原始代码。你问的问题不太清楚,更新后的问题有不同的示例,但你也可以根据条件筛选列。请参阅示例。此外,最好将此作为新问题发布,以获得更多关注(并链接回此问题以供参考):)