2017-08-15 14 views
2

我有一堆我正在嘗試寫入文件的URL。我將這些URL存儲在熊貓數據框中。在函數中調用兩個熊貓列?

數據幀有兩列: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)) 

但是當我打電話的功能,它obvioulsly失敗,因爲os.path.join期望一個string而不是series。因此,我得到錯誤join() argument must be str or bytes, not 'Series'

任何想法如何我可以simultaenously呼籲df.iddf.url

謝謝/ R

+1

順便說一句:不要使用catchall'Exception'。保持具體,不經意間吞下你可能不想要的其他問題。 –

回答

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) 
+0

謝謝!這幫助我很多! – Rachel

1

我覺得你行需要applyaxis=1的過程,然後通過x.urlx.id得到每行的值,becasue按列與Series正與指數,這裏urlid

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 
+0

謝謝!這是非常具有說明性的,爲我提供了一些新的知識! – Rachel

+1

嗯,我很好奇,你爲什麼認爲'iterrows'更好?我認爲最好的是[避免](https://stackoverflow.com/a/24871316/2901002)它。 – jezrael

+1

'iterrows'不推薦用於可以被矢量化的操作。但是,我不認爲網址請求屬於這個類別。 – Alexander