在函数内遍历Pandas序列的行

5 投票
2 回答
12979 浏览
提问于 2025-04-18 09:41

我正在写一个函数,这个函数的一部分需要遍历一个 Series 的行。这个函数应该遍历传给它的 DataFrame 中某一列的行,也就是 df['col']。但是,当我尝试使用 .iterrows 时,出现了一个错误,提示 Series 没有这个属性。而使用 .iteritems 也产生了错误。有没有其他方法可以遍历某一列的行呢?我需要能够访问到索引和列的值。

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

2 个回答

10

使用:

rimcol.iteritems()

因为 iteritems() 是一个函数,所以你必须加上括号。如果不加括号,你得到的就是一个实例方法对象,而不是这个方法返回的迭代器。

2

其实这些都不需要逐行遍历,就像Ryan G在评论里提到的那样。我觉得这段(没测试过的!)代码是等价的。

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

撰写回答