2014-01-09 59 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