我有一个熊猫数据帧,看起来像这样(它非常大)
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
这些方法似乎都不起作用。我没有在数据框架中看到更新的值。
从列中增加MAX数。例如:
df1 = [sort_ID, Column1,Column2]
print(df1)
我的输出:
Sort_ID Column1 Column2
12 a e
45 b f
65 c g
78 d h
MAX = df1['Sort_ID'].max() #This returns my Max Number
现在,我需要在df2中创建一个列,并填充使MAX增加的列值。
Sort_ID Column1 Column2
79 a1 e1
80 b1 f1
81 c1 g1
82 d1 h1
注意:df2最初只包含columnn1和Column2。我们需要创建Sortid列,并从df1增加MAX。
你可以使用df.at:
for i, row in df.iterrows():
ifor_val = something
if <condition>:
ifor_val = something_else
df.at[i,'ifor'] = ifor_val
对于0.21.0之前的版本,使用df.set_value:
for i, row in df.iterrows():
ifor_val = something
if <condition>:
ifor_val = something_else
df.set_value(i,'ifor',ifor_val)
如果你不需要行值,你可以简单地遍历df的索引,但我保留了原始的for循环,以防你需要行值来处理这里没有显示的东西。
你可以使用的一个方法是itertuples(),它迭代DataFrame行作为命名元组,索引值作为元组的第一个元素。与iterrows()相比,它要快得多。对于itertuples(),每行在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,使用。at比loc快得多。
Pandas DataFrame object should be thought of as a Series of Series. In other words, you should think of it in terms of columns. The reason why this is important is because when you use pd.DataFrame.iterrows you are iterating through rows as Series. But these are not the Series that the data frame is storing and so they are new Series that are created for you while you iterate. That implies that when you attempt to assign tho them, those edits won't end up reflected in the original data frame.
好了,现在问题已经解决了:我们该怎么做?
在这篇文章之前的建议包括:
pd.DataFrame。set_value在Pandas 0.21版已弃用
pd.DataFrame.ix已弃用
pd.DataFrame.loc很好,但可以在数组索引器上工作,你可以做得更好
我的建议
使用pd.DataFrame.at
for i in df.index:
if <something>:
df.at[i, 'ifor'] = x
else:
df.at[i, 'ifor'] = y
你甚至可以把它改为:
for i in df.index:
df.at[i, 'ifor'] = x if <something> else y
回应评论
如果我需要使用前一行的值if条件?
for i in range(1, len(df) + 1):
j = df.columns.get_loc('ifor')
if <something>:
df.iat[i - 1, j] = x
else:
df.iat[i - 1, j] = y