【问题标题】:Iterating through rows of a Pandas series within a function在函数中遍历 Pandas 系列的行
【发布时间】:2014-06-13 14:00:34
【问题描述】:

我正在编写一个函数部分,它应该遍历 Series 的行。该函数应该遍历传递给它的 DataFrame 列的行,即 df['col'],但是当我尝试使用 .iterrows 时,我收到一个错误,即 Series 没有该属性并使用 @ 987654326@ 产生以下错误。还有其他方法可以遍历列的行吗?我需要能够访问索引和列值。

def get_RIMsin(df, obs, rimcol):
    """dataframe, obs column,rim column"""    
    maxval =df['Mmedian'].max()
    minval =df['Mmedian'].min()
    dfrange = maxval-minval
    amplitude = dfrange/2

    convert = (2*np.pi)/365
    startday = obs.idxmax().dayofyear
    sinmax = 91

    for row in rimcol.iteritems: #This is where I'd like to go through rows of a series
        diff = sinmax - startday
        adjday = row.dayofyear + diff
        adjsin = np.sin(adjday * convert)
        df['RIMsine'] = row + adjsin
    return df

get_RIMsin(sve_DOC, sve_DOC['DOC_mg/L'], sve_DOC['RIMsDOC'])

TypeError                                 Traceback (most recent call last)
<ipython-input-98-4811cbf80e78> in <module>()
     17     return df
     18 
---> 19 get_RIMsin(sve_DOC, sve_DOC['DOC_mg/L'], sve_DOC['RIMsDOC'])
     20 """get_RIM2(svv_DOC, svv_DOC['DOC_mg/L'], svv_DOC['RIMsDOC'])
     21 get_RIM2(svw_DOC, svw_DOC['DOC_filt_mg/l'], svw_DOC['RIMsDOC'])

<ipython-input-98-4811cbf80e78> in get_RIMsin(df, obs, rimcol)
     10     sinmax = 91
     11 
---> 12     for row in rimcol.iteritems:
     13         diff = sinmax - startday
     14         adjday = row.dayofyear + diff

TypeError: 'instancemethod' object is not iterable

【问题讨论】:

  • 你为什么不创建一个小函数,你可以使用.apply() [与数据框或系列]。这应该比使用 iterrows 和循环更快。 pandas.pydata.org/pandas-docs/dev/generated/…
  • *另外,我注意到DOC_mg/L 列。很高兴看到你的进步!

标签: python python-2.7 pandas


【解决方案1】:

用途:

rimcol.iteritems()

由于iteritems() 是一个函数,因此您必须包含括号。否则,您将获得一个实例方法对象,而不是该实例方法返回的迭代器。

【讨论】:

    【解决方案2】:

    正如 Ryan G 在 cmets 中指出的那样,这些实际上都不需要行迭代。我认为这个(未经测试!)代码是等效的。

    convert = (2*np.pi)/365
    sinmax = 91
    
    def get_RIMsin(df, obs, rimcol):
        """dataframe, obs column,rim column"""    
        amplitude = df['Mmedian'].ptp()/2
    
        startday = obs.idxmax().dayofyear
    
        diff = sinmax - startday
        adjday = rimcol + diff
        adjsin = np.sin(adjday * convert)
        df['RIMsine'] = adjsin
        return df
    

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多