【问题标题】:Call two pandas columns in a function?在函数中调用两个熊猫列?
【发布时间】:2017-08-15 07:39:32
【问题描述】:

我有一堆要写入文件的 URL。我将 URL 存储在 pandas 数据框中。

数据框有两列:urlid。我正在尝试从url 请求每个 URL 并将其写入名为id 的文件中。

这是我目前得到的:

def get_link(url): 
    file_name = os.path.join('/mypath/foo/bar', df.id)
    try: 
        r = requests.get(url)
    except Exception as e:
        print("Failded to get " + url)
    else:
        with open(file_name, 'w') as f: 
            f.write(r.text)

df.url.apply(lambda l: get_link(l))

但是当我调用该函数时,它显然会失败,因为 os.path.join 需要 string 而不是 series。因此我收到错误join() argument must be str or bytes, not 'Series'

有什么想法可以同时调用df.iddf.url

谢谢你/R

【问题讨论】:

  • 顺便说一句:不要使用笼统的Exception。保持具体,以免无意中吞下您可能不想要的其他问题。

标签: python python-3.x function pandas lambda


【解决方案1】:

除了url 之外,您还可以增强函数以采用id_ 参数。

def get_link(url, id_): 
    file_name = os.path.join('/mypath/foo/bar', id_)
    try: 
        r = requests.get(url)
    except ConnectionError, MissingSchema as e:
        print("Failded to get " + url)
    else:
        with open(file_name, 'w') as f: 
            f.write(r.text)

然后只需遍历您的数据框即可调用您的函数。

for idx, row in df.iterrows():
    get_link(url=row.url, id_=row.id)

【讨论】:

  • 谢谢!这对我有很大帮助!
【解决方案2】:

我认为您需要 applyaxis=1 来逐行处理,然后通过 x.urlx.id 获取每行的值,因为使用 Series 并按列索引,这里是 url 和 @ 987654329@:

def get_link(x): 
    print (x) 
    file_name = os.path.join('/mypath/foo/bar', x.id)
    try: 
        r = requests.get(x.url)
    except Exception as e:
        print("Failded to get " + x.url)
    else:
        with open(file_name, 'w') as f: 
            f.write(r.text)

df.apply(get_link, axis=1)

示例

df = pd.DataFrame({'url':['url1','url2'],
                   'id':[1,2]})

print (df)
   id   url
0   1  url1
1   2  url2

def get_link(x):
    print (x) 
    print ('url is: {}'.format(x.url))
    print ('id is: {}'.format(x.id))

df.apply(get_link, axis=1)

id        1
url    url1
Name: 0, dtype: object
url is: url1
id is: 1
id        2
url    url2
Name: 1, dtype: object
url is: url2
id is: 2

【讨论】:

  • 谢谢!这很有说明性,为我提供了一些新知识!
  • 嗯,我很好奇,为什么你认为iterrows 更好?我认为最好的是avoid它。
  • iterrows 不推荐用于可以矢量化的操作。但是,我不认为 url 请求属于这一类。
  • 很抱歉让您失望了!只是我理解iterrows - 我以前用过。我对您提供的解决方案不熟悉,还不太了解。它仍然运作良好!为什么你会尽量不使用iterrows?希望没问题!无论如何谢谢你!
  • 如果只是循环值,它可以同时使用两种解决方案。但通常最好是避免迭代,因为最慢
猜你喜欢
  • 2019-07-30
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2018-07-02
  • 2014-10-20
相关资源
最近更新 更多