2016-12-22 5 views
1

Я пытаюсь получить некоторые данные из xml с помощью pandas. В настоящее время у меня есть «рабочий» код, и, работая, я имею в виду, что он почти работает.получить данные из xml с помощью pandas

import pandas as pd 
import requests 
from bs4 import BeautifulSoup 

url = "http://degra.wi.pb.edu.pl/rozklady/webservices.php?" 


response = requests.get(url).content 
soup = BeautifulSoup(response) 

tables = soup.find_all('tabela_rozklad') 

tags = ['dzien', 'godz', 'ilosc', 'tyg', 'id_naucz', 'id_sala', 
'id_prz', 'rodz', 'grupa', 'id_st', 'sem', 'id_spec'] 

df = pd.DataFrame() 
for table in tables: 
    all = map(lambda x: table.find(x).text, tags) 
    df = df.append([all]) 

df.columns = tags 

a = df[(df.sem == "1")] 
a = a[(a.id_spec == "0")] 
a = a[(a.dzien == "1")] 
print(a) 

Так я получаю ошибку "а = ДФ [(df.sem == "1")]", который:

Файл "панды \ index.pyx", строка 139, в pandas.index.IndexEngine.get_loc (pandas \ index.c: 4443)

Файл «pandas \ index.pyx», строка 161, в pandas.index.IndexEngine.get_loc (pandas \ index.c: 4289)

Файл "панды \ SRC \ hashtable_class_helper.pxi", строка 732, в pandas.hashtable.PyObjectHashTable.get_item (панды \ hashtable.c: 13733)

Файл "панды \ SRC \ hashtable_class_helper.pxi", строка 740, в pandas.hashtable.PyObjectHashTable.get_item (панд \ hashtable.c: 13687)

Как я читал другие стеки вопросы, которые я видел, как люди предлагают использовать ФР .loc так я Модифицированное эту строку в

a = df.loc[(df.sem == "1")] 

Теперь компиляции кода, но результаты показывают, как эта строка не существует. Необходимо упомянуть, что проблема связана только с тегом «sem». Отдых работает отлично, но, к сожалению, мне нужно использовать именно этот тег. Если бы кто-нибудь мог объяснить, что я вызываю эту ошибку, и как ее исправить, я был бы благодарен.

ответ

1

Вы можете добавить ignore_index=True в append для избежание дублирования index, а затем необходимо выбрать столбец sem по [], потому что функция sem:

df = pd.DataFrame() 
for table in tables: 
    all = map(lambda x: table.find(x).text, tags) 
    df = df.append([all], ignore_index=True) 

df.columns = tags 
#print (df) 

a = df[(df['sem'] == '1') & (df.id_spec == "0") & (df.dzien == "1")] 
print(a) 
    dzien godz ilosc tyg id_naucz id_sala id_prz rodz grupa id_st sem id_spec 
0  1 1  2 0  52  79  13 W  1 13 1  0 
1  1 3  2 0  12  79  32 W  1 13 1  0 
2  1 5  2 0  52  65  13 Ćw  1 13 1  0 
3  1 11  2 0  201  3  70 Ćw 10 13 1  0 
4  1 5  2 0  36  78  13 Ps  5 13 1  0 
5  1 5  2 1  18  32 450 Ps  3 13 1  0 
6  1 5  2 2  18  32 450 Ps  4 13 1  0 
7  1 7  2 1  18  32 450 Ps  7 13 1  0 
8  1 7  2 2  18  32 450 Ps  8 13 1  0 
9  1 7  2 0  66  65 104 Ćw  1 13 1  0 
10  1 7  2 0  283  3 104 Ćw  5 13 1  0 
11  1 7  2 0  346  5 104 Ćw  8 13 1  0 
12  1 7  2 0  184  29  13 Ćw  7 13 1  0 
13  1 9  2 0  66  65 104 Ćw  2 13 1  0 
14  1 9  2 0  346  5  70 Ćw  8 13 1  0 
15  1 9  1 0  73  3 203 Ćw  9 13 1  0 
16  1 10  1 0  73  3 203 Ćw 10 13 1  0 
17  1 9  2 0  184  19  13 Ps 13 13 1  0 
18  1 11  2 0  184  19  13 Ps 14 13 1  0 
19  1 11  2 0  44  65  13 Ćw  9 13 1  0 
87  1 9  2 0  201  54 463 W  1 17 1  0 
88  1 3  2 0  36  29  13 Ćw  2 17 1  0 
89  1 3  2 0  211  5  70 Ćw  1 17 1  0 
90  1 5  2 0  211  5  70 Ćw  2 17 1  0 
91  1 7  2 0  36  78  13 Ps  4 17 1  0 
105  1 1  2 1  11  16  32 Ps  2 18 1  0 
106  1 1  2 2  11  16  32 Ps  3 18 1  0 
107  1 3  2 0  51  3 457 W  1 18 1  0 
110  1 5  2 2  11  16  32 Ps  1 18 1  0 
111  1 7  2 0  91  64  97 Ćw  2 18 1  0 
112  1 5  2 0  283  3 457 Ćw  2 18 1  0 
254  1 5  1 0  12  29  32 Ćw  6 13 1  0 
255  1 6  1 0  12  29  32 Ćw  5 13 1  0 
462  1 7  2 0  98  1 486 W  1 19 1  0 
463  1 9  1 0  91  1 484 W  1 19 1  0 
487  1 5  2 0  116  19  13 Ps  1 17 1  0 
488  1 7  2 0  116  19  13 Ps  2 17 1  0 
498  1 5  2 0  0  0 431 Ps  2 17 1  0 
502  1 5  2 0  0  0 431 Ps 15 13 1  0 
503  1 5  2 0  0  0 431 Ps 16 13 1  0 
504  1 5  2 0  0  0 431 Ps 19 13 1  0 
505  1 5  2 0  0  0 431 Ps 20 13 1  0 
531  1 13  2 0  350  79 493 W  1 13 1  0 
532  1 13  2 0  350  79 493 W  2 17 1  0 
533  1 13  2 0  350  79 493 W  1 18 1  0 
+0

Это работает очень хорошо, но вы можете объяснить, почему мой код не было? – Wesspe

+0

спасибо, что принял. Так что это проблема с кодовыми словами, поэтому, если ваш столбец 'sum',' mean', 'count',' sem', вы не можете выбрать 'df.sum',' df.count', 'df.mean', 'df.sem', потому что все они являются функцией pandas [' sum'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.sum.html), ['mean' ] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html) ... Поэтому для этого столбца нужно выбрать 'df ['sum']', 'df [ 'mean'] '...' df ['sem'] '. – jezrael

+0

см. Документы [здесь] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access) - проверьте 'предупреждение' -' Атрибут будет недоступен, если он конфликтует с существующим имя метода, например s.min не допускается .' – jezrael

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