2014-01-09 5 views
0

У меня есть куча URL-адресов, хранящихся в фрейме данных, и я очищаю их через модуль синтаксического анализа URL. Вопрос, который я имею, что поле «siteClean», который должен обновить с очищенной URL обновляет весь столбец, а не отдельные клетки ...Обновление pandas dataframe через петли

Вот код:

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»]' возвращает серию на вашем dataframe, поэтому он обновляет весь столбец, было бы лучше, чтобы построить свой чистый список первых и создать dataframe от него – EdChum

+0

да я понял, что и это, вероятно, лучшее решение для того, чтобы этот проект был выполнен и завершен ... но есть ли способ обновить dataframe в цикле 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

Смежные вопросы