我有一个熊猫数据框,看起来像这样(它很大)
date exer exp ifor mat
1092 2014-03-17 American M 528.205 2014-04-19
1093 2014-03-17 American M 528.205 2014-04-19
1094 2014-03-17 American M 528.205 2014-04-19
1095 2014-03-17 American M 528.205 2014-04-19
1096 2014-03-17 American M 528.205 2014-05-17
现在我想逐行迭代,当我遍历每一行时,每一行中ifor
的值可能会根据某些条件而变化,我需要查找另一个数据帧。
现在,我如何在迭代时更新它。试了几次都没成功。
for i, row in df.iterrows():
if <something>:
row['ifor'] = x
else:
row['ifor'] = y
df.ix[i]['ifor'] = x
这些方法似乎都行不通。我没有在数据框中看到更新的值。
发布于 2017-12-02 11:37:20
您可以使用的一种方法是itertuples()
,它将DataFrame行作为命名元组进行迭代,索引值作为元组的第一个元素。而且与iterrows()
相比,它的速度要快得多。对于itertuples()
,每个row
在DataFrame中都包含它的Index
,您可以使用loc
来设置该值。
for row in df.itertuples():
if <something>:
df.at[row.Index, 'ifor'] = x
else:
df.at[row.Index, 'ifor'] = x
df.loc[row.Index, 'ifor'] = x
在大多数情况下,itertuples()
比iat
或at
更快。
感谢@SantiStSupery,using .at
is much faster than loc
。
发布于 2014-04-28 10:36:52
您应该使用df.ix[i, 'exp']=X
或df.loc[i, 'exp']=X
而不是df.ix[i]['ifor'] = x
来赋值。
否则,您正在处理一个视图,并且应该会得到一个预热:
-c:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
但可以肯定的是,循环可能更好地被一些矢量化算法取代,以充分利用DataFrame
,就像@Phillip Cloud建议的那样。
发布于 2020-06-01 04:28:18
最好使用带有df.apply()
的lambda
函数-
df["ifor"] = df.apply(lambda x: {value} if {condition} else x["ifor"], axis=1)
https://stackoverflow.com/questions/23330654
复制相似问题