我有一个熊猫数据框,看起来像这样(它是一个相当大的)
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
这些方法似乎都不管用。我看不到数据框中更新的值。
您可以使用的方法是itertuples()
,它以命名元组的形式迭代DataFrame行,索引值作为元组的第一个元素。而且它比iterrow()
要快得多。对于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
快得多。
熊猫数据帧对象应该被认为是一系列的序列。换句话说,您应该从列的角度来考虑它。这一点之所以重要,是因为当您使用pd.DataFrame.iterrows
时,您正在以序列的形式遍历行。但这些不是数据帧存储的序列,因此它们是在迭代时为您创建的新序列。这意味着,当您尝试将这些编辑指定给它们时,这些编辑不会最终反映在原始数据帧中。
好了,现在这已经不成问题了:我们该怎么办?
在这篇文章之前的建议包括:
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
您可以使用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循环,以防您需要这里未显示的某些内容的行值。
使现代化
自版本0.21.0以来,df.set_value()已被弃用。您可以改用df.at()
for i, row in df.iterrows():
ifor_val = something
if <condition>:
ifor_val = something_else
df.at[i,'ifor'] = ifor_val
我有一个来自熊猫的: 输出: 现在我要迭代这个帧的行。对于每一行,我希望能够通过列的名称访问其元素(单元格中的值)。例如: 有可能在熊猫身上做到这一点吗? 我发现了这个类似的问题。但它并没有给我我需要的答案。例如,在那里建议使用: 或 但我不理解对象是什么,以及如何使用它。
在编程方面,我是一个新手,特别是熊猫。我也很抱歉,我问了一个已经在SF上提到的问题:我并不真正理解这个问题的现有答案。可能重复,但这个答案对新手来说很容易理解,如果不太全面的话。
我需要对pandas数据帧进行迭代,以便将每一行作为带有的函数(实际上是类构造函数)的参数传递。这意味着每一行都应该像字典一样,具有键、列名和值(每行对应的值)。
我有客户对象的列表。我想迭代列表并按1递增顺序。 我尝试了每个列表,但在这里我必须创建新列表并在其中添加值。 有没有更好的方法?我尝试使用streams,但它只是映射订单
数据帧: 我有一段代码逐列遍历数据帧: 我需要删除它是NaN的行。我该怎么做?我已经尝试了. isnull()和. Notnull(),但它们返回错误
我想在字符串与给定值匹配时更新该值 有没有人可以使用Java streams API来实现上述功能