通过for循环更新pandas数据帧

时间:2014-01-09 19:15:38

标签: python for-loop pandas dataframe

我有一堆URL存储在数据框中,我通过url解析模块清理它们。我遇到的问题是,应该使用已清理的网址更新的“siteClean”字段是更新整个列而不是单个单元格...

以下是代码:

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

1 个答案:

答案 0 :(得分: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,其条目是由指定函数转换的输入。你可以在任何你喜欢的地方坚持使用新的输出系列。它可以是新列(在您的旧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