代码之家  ›  专栏  ›  技术社区  ›  Christopher

熊猫:将函数应用于行,写入新列

  •  0
  • Christopher  · 技术社区  · 6 年前

    将函数应用于数据帧

    数据

    url                            visitors
    http://somedomain.com          200000
    http://someotherdomain.com     150000
    http://somenewdomain.com       11000
    

    功能:

    def metacrawler(url)
        ...
        return data
    
    def contentcrawler(url)
        ...
        return data
    
    # Counter
    progress = 0
    

    回路

    for index, row in data.iterrows():
        print(str(progress)," out of ",str(len(data)))
        print('Starting meta crawling.')
        row['meta'] = metacrawler(row["url"])
        print('Starting content crawling.')
        row['content'] = contentcrawler(row["url"])
        print('Complete.')
        progress += 1
    

    但是,当我在几次迭代之后中止了这个过程时,我发现没有数据被写入数据帧。也没有创建列。

    解决方案

    def func(row):
        print("Crawling Meta")
        meta = metacrawler(row["url"])
        print("Crawling Content")
        tags = contentcrawler(row["url"])
        return meta, content
    
    data[['meta', 'content']] = data.apply(func, axis=1, result_type='expand')
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   pypypy    6 年前

    你可以用 .apply() 功能 Docs result_type='expand'

    In [3]: df = pd.DataFrame({'one':[1,2,3,4], 'two':[5,6,7,8]})
    
    In [4]: df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')
    Out[4]:
        0   1
    0   6   6
    1   8   8
    2  10  10
    3  12  12
    
    In [5]: df[['new', 'etc']] = df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')
    
    In [6]: df
    Out[6]:
       one  two  new  etc
    0    1    5    6    6
    1    2    6    8    8
    2    3    7   10   10
    3    4    8   12   12
    

    编辑:

    def func(row):
        print(row)
        return sum(row), sum(row)
    
    
    In [3]: df = pd.DataFrame({'one':[1,2,3,4], 'two':[5,6,7,8]})
    
    In [4]: df.apply(func), axis=1, result_type='expand')
    Out[4]:
        0   1
    0   6   6
    1   8   8
    2  10  10
    3  12  12
    
    In [5]: df[['new', 'etc']] = df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')
    
    In [6]: df
    Out[6]:
       one  two  new  etc
    0    1    5    6    6
    1    2    6    8    8
    2    3    7   10   10
    3    4    8   12   12