2014-01-09 86 views
0

我有一堆存儲在數據框中的URL,我通過url解析模塊清理它們。那我遇到的問題是,「siteClean」字段是應該用清潔的網址是更新整個列而不是單個細胞更新...通過for循環更新熊貓數據幀

下面是代碼:

results = resultsX.copy(deep = True) 
results = results.reset_index(drop = True) 
results['siteClean'] = '' 


from urlparse import urlsplit 
import re 

for row in results.iterrows(): 
    #print row[1] 
    url = row[1][1] 
    if not re.match(r'http(s?)\:', url): 
     url = 'http://' + url 
    parsed = urlsplit(url) 
    host = parsed.netloc 
    #print host 
    #row[1][1] = host 
    #results[row][1] = host 
    results['siteClean'] = host 
    print results 
+2

'結果[「siteClean」]'返回你的數據幀的一系列這就是爲什麼它更新了整列,倒不如先建立自己的清潔列表並從中 – EdChum

+0

創建一個數據幀是的,我意識到這可能是完成此項目的最佳解決方案......但有沒有辦法更新for循環中的數據框? –

+2

您需要[index](http://pandas.pydata.org/pandas-docs/stable/indexing.html),這是一個預先存在的數據框,還是您從頭開始填充和創建,您可以編制索引使用整數或標籤爲基礎,如果你是從頭開始做這件事,那麼當你附加每個條目時,你需要跟蹤行號,例如'results.iloc [row] ['siteClean'] = host'或類似的東西。如果你首先填充列表,如果你有很多url,儘管那麼它可能會很慢,但它會更簡單和容易理解 – EdChum

回答

2

一般來說,如果可以避免,最好避免在幀的行上循環。如果我正確理解您的問題,您需要查看框架中的單個列,並在該列的每個元素上應用一個函數。然後你想把所有這些函數調用的結果放到原始幀的一列中。也許一個新的專欄,也許代替舊的專欄。這聽起來像是pd.Series.map的工作。

import pandas as pd 
import numpy as np 

np.random.seed(0) 

n=10 

df = pd.DataFrame({'num': np.random.randn(n), 
        'lett': np.random.choice(
         list('abcdefghijklmnopqrstuvwxyz'),n) 
        }) 

df看起來是這樣的:

df original

建立一個功能單一的字母劃爲一個輔音或元音:

def classify_letter(char): 
    if char in list('aeiou'): 
     return 'vowel' 
    else: 
     return 'consonant' 

然後你可以使用map生成新的Series,其條目是由規範轉換的輸入的條目ified函數。你可以隨心所欲地粘貼新的輸出系列。它可以是一個新列(在舊的DataFrame或其他地方),也可以替換舊列。需要注意的是map僅適用於一個Series,所以在使用前一定要選擇到一列:

df['new'] = df['lett'].map(classify_letter) 

給出:

df with col added

而如果你從原來的設置開始跑:

df['lett'] = df['lett'].map(classify_letter) 

然後你會用新的替換舊列:

df with col replaced