在循环python中更改数据框列中的值

时间:2018-05-05 09:37:04

标签: python pandas dataframe

我是Python pandas库和使用数据框架的新手。 我正在使用Jupyter。 我有点迷失这种语法。

我想遍历行并将新值设置为 new_value 列。 我以为我会这样做,但它会引起错误。

df_merged['new_value'] = 0

for i, row in df_merged.iterrows():
    df_merged['new_value'][i] = i

我也尝试过如下计算:

 df_merged['new_value'][i] = df_merged['move_%'] * df_merged['value']

但它不起作用。

我收到此错误:

  

/usr/lib/python3.4/site-packages/ipykernel_launcher.py:4:       SettingWithCopyWarning:       尝试在DataFrame的切片副本上设置值        
请参阅文档中的警告:http://pandas.pydata.org/pandas-       文档/稳定/ indexing.html#索引视图抗副本        从sys.path中删除cwd后。

我在这里做错了什么?
感谢。

5 个答案:

答案 0 :(得分:2)

你可以使用这个:

df_merged['new_value'] = df.index

您也可以使用apply方法。

df_merged['new_value'] = df_merged.apply(lambda row : row.name, axis=1)
  

我收到此错误:正在尝试在a的副本上设置值   来自DataFrame的切片

这不是错误,它只是一条警告信息。

来自this回答:

创建SettingWithCopyWarning以标记可能令人困惑的链接"分配,例如以下,不总是按预期工作,特别是当第一个选择返回副本时。

您可以使用pd.DataFrame.loc方法避免此警告消息。

for i, row in df_merged.iterrows():
    df_merged.loc[i,'price_new']  = i 

答案 1 :(得分:1)

这也很好:

df_merged['price_new'] = 0

for i, row in df_merged.iterrows():
     df_merged.loc[i,'price_new']  = i 

答案 2 :(得分:1)

这不是错误。它只是说数据帧_merged被初始化为父daraframe的视图,因此它本身不是数据帧,因此不能取值。这可能就是为什么在此步骤之后检查合并数据框的值时它仍然与原始数据相同。您有两种选择:当您从其父数据框初始化时,使用.copy()方法使您的_merged数据框本身成为副本。或者在循环或计算中使用在合并数据帧上完成的相同计算或索引将值设置到父数据帧。我建议使用第一种方法,因为我认为内存不是您的约束,您希望在新数据框中更改值。此外,它也很简单。

答案 3 :(得分:1)

对于熊猫数据帧中的循环更新:

for i, row in df_merged.iterrows():
     df_merged.set_value(i,'new_value',i)

应该能够更新熊猫数据框中的值。

  

FutureWarning:不建议使用set_value,并将在以后的版本中将其删除。请改用.at []或.iat []访问器。

for i, row in df_merged.iterrows():
     df_merged.at[i,'new_value'] = i

应该是首选。

答案 4 :(得分:0)

如果你想在两列上进行乘法运算,你不必按行进行,以下情况应该有效:

df_merged['new_value'] = df_merged['move_%'] * df_merged['value']