【问题标题】:Python / Updating panda row with new column value from functionPython /使用函数中的新列值更新熊猫行
【发布时间】:2015-10-23 16:34:25
【问题描述】:

Python 2.7 我正在尝试编写“机器人检查”的结果(尽管我认为这适用于其他情况),其中我正在迭代数据帧。 我试过了

import robotparser
import urlparse
import pandas as pd
df = pd.DataFrame(dict(A=['http://www.python.org'
                          ,'http://www.junksiteIamtellingyou.com'
                         ]))

df
    A
0   http://www.python.org
1   http://www.junksiteIamtellingyou.com

agent_name = 'Test'
for i in df['A']:
    try:
        parser = robotparser.RobotFileParser()
        parser.set_url(urlparse.urljoin(i,"robots.txt"))
        parser.read()
    except Exception as e:
        df['Robot'] =  'No Robot.txt'
    else:
        df['Robot'] =  parser.can_fetch(agent_name, i)
df
    A                                       Robot
0   http://www.python.org                   No Robot.txt <<<-- NOT CORRECT
1   http://www.junksiteIamtellingyou.com    No Robot.txt

当然,迭代的最后一个值正在覆盖整个值列。 Robot 的值应为“True”(可以通过从数据框中删除垃圾 URL 来证明。

我尝试了 .loc 的一些不同排列,但无法让它们工作。他们似乎总是添加行而不是更新现有行的新列。

那么,有没有办法指定正在更新的列(使用函数结果)?也许使用 .loc(location),或者可能有另一种方式,例如使用 lambda?非常感谢您的帮助。

【问题讨论】:

    标签: python pandas iterated-function


    【解决方案1】:

    为此有一个apply

    import robotparser
    import urlparse
    import pandas as pd
    df = pd.DataFrame(dict(A=['http://www.python.org'
                              ,'http://www.junksiteIamtellingyou.com']))
    
    def parse(i, agent_name):
        try:
            parser = robotparser.RobotFileParser()
            parser.set_url(urlparse.urljoin(i, "robots.txt"))
            parser.read()
        except Exception as e:
            return 'No Robot.txt'
        else:
            return parser.can_fetch(agent_name, i)
    
    df['Robot'] = df['A'].apply(parse, args=('Test',))
    

    【讨论】:

    • 这非常有效。谢谢你。起初,我认为您的代码中有一个小错误(对我来说 args=('Test',) 不会是 args=(,'Test') 但现在我看到迭代器出来了df['A'].apply 部分。至少我是这么理解的。做得好;再次感谢。
    • args 参数需要一个序列(例如元组或列表)作为其参数。序列的内容作为附加位置参数传递给parse('Test',) 是一个包含一个值的元组。逗号是必需的,因为 Python 将 ('Test') 计算为字符串 'Test'逗号构成元组。 args = ['Test'] 也可以。
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2018-12-29
    • 2018-02-01
    • 2021-06-06
    • 2014-11-27
    • 2017-09-05
    • 2017-03-23
    相关资源
    最近更新 更多