2015-08-28 5 views
0

EDIT 2, 9/1 См. Мой ответ ниже!Q: Pandas dataframe from for loop

Pretty new at Python and Pandas here. У меня есть сценарий, который использует цикл for для запроса моей базы данных, используя каждую строку в моем списке. Все это отлично работает, но я не могу понять, как создать кадр данных из результатов этого цикла. Любые и все указатели приветствуются!

#Remove stuff 
print "Cleaning list" 
def multiple_replacer(key_values): 
    replace_dict = dict(key_values) 
    replacement_function = lambda match: replace_dict[match.group(0)] 
    pattern = re.compile("|".join([re.escape(k) for k, v in key_values]), re.M) 
    return lambda string: pattern.sub(replacement_function, string) 

multi_line = multiple_replacer(key_values) 

print "Querying Database..." 
for line in source: 
    brand_url = multi_line(line) 
    #Run Query with cleaned list 
    mysql_query = ("select ub.url as 'URL', b.name as 'Name', b.id as 'ID' from api.brand b join api.url_brand ub on b.id=ub.brand_id where ub.url like '%%%s%%' and b.deleted=0 group by 3;" % brand_url) 
    list1 = [] 
    brands = my_query('prod', mysql_query) 

print "Writing CSV..." 
#Create DF and CSV 
for row in brands: 
    list1.append({"URL":row['URL'],"Name":['Name'],"ID":['ID']}) 
    if brands.shape == (3,0): 
    df1 = pd.DataFrame(data = brands, columns=['URL','Name','ID']) 
    output = df1.to_csv('ongoing.csv',index=False) 

EDIT 8/30 Вот мой редактировать, пытаясь использовать метод zyxue в:

#Remove stuff 
print "Cleaning list" 
def multiple_replacer(key_values): 
    replace_dict = dict(key_values) 
    replacement_function = lambda match: replace_dict[match.group(0)] 
    pattern = re.compile("|".join([re.escape(k) for k, v in key_values]), re.M) 
    return lambda string: pattern.sub(replacement_function, string) 

multi_line = multiple_replacer(key_values) 

print "Querying Database..." 
for line in source: 
    brand_url = multi_line(line) 
    #Run Query with cleaned list 
    mysql_query = ("select ub.url as 'URL', b.name as 'Name', b.id as 'ID' from api.brand b join api.url_brand ub on b.id=ub.brand_id where ub.url like '%%%s%%' and b.deleted=0 group by 3;" % brand_url) 
    brands = my_query('prod', mysql_query) 

print "Writing CSV..." 
#Create DF and CSV 
records = [] 
for row in brands: 
    records.append({"URL":row['URL'],"Name":['Name'],"ID":['ID']}) 
    if brands.shape == (3,0): 
    records.append(dict(zip(brands, ['URL', 'Name', 'ID']))) 
df1 = pd.DataFrame.from_records(records) 
output = df1.to_csv('ongoing.csv', index=False) 

, но это только возвращает пустой CSV. Я уверен, что я применяю это неправильно.

+0

вы переписываете свой фрейм с каждой итерацией цикла. –

+0

Да, я подумал, что после того, как я разместил. Однако не уверен в решении. Все еще очень новый в этом и работал только со статическими списками, а не с циклом for, для чего-то подобного. – sstewart

+0

http://stackoverflow.com/questions/17530542/how-to-add-pandas-data-to-an-existing-csv-file – JohnE

ответ

0

Хорошо, я понял, и я подумал, что должен опубликовать рабочий сценарий. @zyxue был в значительной степени прав.

source = open('urls.txt') 
key_values = ("http://",""), ("https://",""), ("www.",""), ("\n","") 

#Remove stuff 
print "Cleaning list" 
def multiple_replacer(key_values): 
    replace_dict = dict(key_values) 
    replacement_function = lambda match: replace_dict[match.group(0)] 
    pattern = re.compile("|".join([re.escape(k) for k, v in key_values]), re.M) 
    return lambda string: pattern.sub(replacement_function, string) 

multi_line = multiple_replacer(key_values) 

print "Querying Database..." 
records = [] 
for line in source: 
    brand_url = multi_line(line) 
    #Run Query with cleaned list 
    mysql_query = ("select ub.url as 'URL', b.name as 'Name', b.id as 'ID' from api.brand b join api.url_brand ub on b.id=ub.brand_id where ub.url like '%%%s%%' and b.deleted=0 group by 3;" % brand_url) 
    brands = my_query('prod', mysql_query) 
    #Append results to dict (records) 
    for row in brands: 
     records.append({"URL":row['URL'],"Name":row['Name'],"ID":row['ID']}) 

#Create DataFrame 
df = pd.DataFrame.from_dict(records) 

#Create CSV  
output = df.to_csv('ongoing.csv',index=False) 

По существу, мне нужно, чтобы слой второго цикла под первым и создать словарь «записи» до того начал зациклившиеся. Это вызывает добавление словаря для каждой строки в «источнике». Кажется, это довольно простая концепция!

0
records = [] 
for row in brands: 
    # if brands.shape == (3,0): 
    #  records.append(dict(zip(brands, ['URL', 'Name', 'ID']))) 
    # update bug fix: 
    if row.shape == (3,0): 
     records.append(dict(zip(row, ['URL', 'Name', 'ID']))) 

df1 = pd.DataFrame.from_records(records) 
output = df1.to_csv('ongoing.csv', index=False) 
# ref: 
# >>> pd.DataFrame.from_records([{'a': 1, 'b':2}, {'a': 11, 'b': 22}]) 
#  a b 
#  0 1 2 
#  1 11 22 
+0

Я попытался реализовать это решение, и он просто вернул пустой набор. Возможно, я не настраиваю его правильно в своем коде? – sstewart

+0

Можете ли вы показать пример ввода? – zyxue

+0

Я обновил свой вопрос выше с тем, как он выглядит после применения вашего кода. – sstewart

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