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

5

我是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: A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas- docs/stable/indexing.html#indexing-view-versus-copy after removing the cwd from sys.path.”
我在这里做错了什么?谢谢。
5个回答

3
您可以只使用这个:
df_merged['new_value'] = df.index

您还可以使用apply方法。
df_merged['new_value'] = df_merged.apply(lambda row : row.name, axis=1)

我遇到了这个错误:DataFrame的切片副本正在尝试设置值。
这并不是一个错误,只是一个警告信息。
根据这个答案所说:
“SettingWithCopyWarning”旨在标记潜在的混乱的“链接”赋值,例如以下内容,特别是在第一个选择返回一个副本时,并不总是按预期工作。
您可以通过使用pd.DataFrame.loc方法来避免此警告消息。
for i, row in df_merged.iterrows():
    df_merged.loc[i,'price_new']  = i 

嗨,所以问题出在索引上? - HeadOverFeet
嗨 @Mihai,但问题只出现在我想应用迭代值时,对吧?当我进行乘法运算时,它是正常的。 - HeadOverFeet
您可以更新该值,但会收到警告,解决方法是使用 loc 方法。 - Mihai Alexandru-Ionut
@HeadOverFeet,您可以在此处阅读更多信息:https://dev59.com/8WIj5IYBdhLWcg3wHhlX - Mihai Alexandru-Ionut
@HeadOverFeet,不客气。我更新了我的答案,并提供了更多的信息。 - Mihai Alexandru-Ionut
如果数据框中存在重复的索引,我认为最终解决方案将无法工作。 - Parsa

2

针对Pandas数据框的循环更新:

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

应该能够在pandas数据框中更新值。

未来警告:set_value已弃用,并将在未来版本中删除。请改用.at []或.iat []访问器。

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

应该优先考虑。

1
这也可以正常工作:

df_merged['price_new'] = 0

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

1
这并不是一个错误。它只是说明数据框_merged被初始化为其父数据框的视图,因此本身不是一个数据框,不能接受值。这可能是在此步骤后检查合并数据框的值仍与原始值相同的原因。您有两个选择:通过在从其父数据框初始化时使用.copy()方法使_merged数据框本身成为副本。或者在循环或计算中使用相同的计算或索引将值设置为父数据框。我建议使用第一种方法,因为我认为内存对您来说不是一个限制,并且您希望在新数据框中更改值。此外,这是最简单直接的方法。

0
如果您想在两列上执行乘法运算,您不必逐行执行,以下方法应该有效:
df_merged['new_value'] = df_merged['move_%'] * df_merged['value']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接