2017-11-29 2 views
0

API의 각 페이지 (페이지 당 100 개의 행 수)에서 데이터를 가져 와서 데이터 프레임을 구성하려고합니다. 현재 아래의 코드는 모든 데이터를 반환하지만 구조가 잘못되었습니다.여러 개의 생성 된 데이터 프레임을 단일 데이터 프레임에 결합하기

17 개의 헤더가 있으므로 17 개의 열에 데이터가 필요합니다. 그러나 [100 rows x 1700 columns]의 데이터 프레임을 출력합니다. 여기서 [10000 rows x 17 columns]가 필요합니다.

나는이 문제를 어떻게 해결할 수 있는지 잘 모르겠다. 어떤 도움을 주시면 감사하겠습니다.

from ebaysdk.finding import Connection as finding 
from bs4 import BeautifulSoup 
import pandas as pd 

x = [] 

for i in range(1,101): 
    print(type(i)) 
    api = finding(siteid='EBAY-GB',appid='some_id',config_file=None) 

    response = api.execute('findItemsByKeywords', {'keywords': 'phone', 'outputSelector' : 'SellerInfo', 
    'paginationInput': {'entriesPerPage': '2','pageNumber': ' '+str(i)}})  

    soup = BeautifulSoup(response.content, 'lxml') 

    items = soup.find_all('item') 

    headers = ['itemid','title','categoryname','categoryid','postalcode','location','sellerusername','feedbackscore','positivefeedbackpercent','topratedseller','shippingservicecost','buyitnowavailable','currentprice','starttime','endtime','watchcount','conditionid'] 

    for object in headers: 
     values = [element.text for element in soup.find_all(object)] 
     x.append(values) 
     df = pd.DataFrame(x) 
     df = df.T 
    print(x) 
#[['152668959069', '252999725410'], ['Samsung GALAXY Ace GT-S5830i (Unlocked) Smartphone Android Phone- ALL COLOURS UK', '8GB 3G Unlocked Android 5.1 Quad Core Smartphone Mobile Phone 2 SIM GPS qHD'], ['Mobile & Smart Phones', 'Mobile & Smart Phones'], ['9355', '9355'], ['RM137PP'], ['Rainham,United Kingdom', 'United Kingdom'], ['deals4u_shop', 'smartlife2017'], ['15700', '456'], ['99.9', '98.5'], ['true', 'true'], ['0.0', '0.0'], ['false', 'false'], ['32.49', '48.9'], ['2017-08-18T18:36:28.000Z', '2017-06-19T09:04:40.000Z'], ['2017-12-16T18:36:28.000Z', '2017-12-16T09:04:40.000Z'], ['272', '134'], ['1000', '1000']] 

    print(df) 
      0             1 \ 
0 152668959069 Samsung GALAXY Ace GT-S5830i (Unlocked) Smartp... 
1 252999725410 8GB 3G Unlocked Android 5.1 Quad Core Smartpho... 

         2  3  4      5 \ 
0 Mobile & Smart Phones 9355 RM137PP Rainham,United Kingdom 
1 Mobile & Smart Phones 9355  None   United Kingdom 

       6  7  8  9 ... 24 25 26 27  28 29 \ 
0 deals4u_shop 15700 99.9 true ... 456 98.5 true 0.0 false 48.9 

1 smartlife2017 456 98.5 true ... 456 98.5 true 0.0 false 48.9 

         30      31 32 33 
0 2017-06-19T09:04:40.000Z 2017-12-16T09:04:40.000Z 214 1000 
1 2017-06-19T09:04:40.000Z 2017-12-16T09:04:40.000Z 182 1000 

편집 : 2 페이지의 처음 두 항목에 대한 첫 페이지와 안양에서 첫 번째 두 항목에 대해 더 많은 코드 및 인쇄 X를 추가했습니다.

+0

df 출력의 문제점은 무엇입니까? 그리고 [DataFrame] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html) * columns * 인수에 헤더를 전달하십시오. – Parfait

+0

문제는 df가 각 루프마다 [2 행 x17 열], [2 행 x34 열], [2 행 x51 열] 등을 출력하고 있다는 것입니다. 어디서 [2 행 × 17 열], [4 행 × 17 열], [6 행 × 17 열] 등의 결과를 생성해야합니까? –

+0

이전에 열을 설정하려고했는데 다음 오류를 반환합니다. 코드 : df = pd.DataFrame (x, columns = headers) AssertionError : 전달 된 17 개의 열, 전달 된 데이터의 2 번째 열 –

답변

0

이것은 더 잘 작동합니다.

사전 이해 버전 :

data_dict = {obj: [element.text for element in soup.find_all(obj)] for obj in headers}  
df = pd.DataFrame(data_dict) 

루프 버전 :

data_dict = {} 
for obj in headers: 
    data_dict[obj] = [element.text for element in soup.find_all(obj)] 

df = pd.DataFrame(data_dict) 
+0

도움이되었습니다 - 감사합니다. –

+0

도움이되었습니다. BTW, 귀하의 문제를 해결하는 경우 답변을 [수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) 할 수 있습니다. –

0

가 반복적으로 최종 연결과 dataframes의 목록에 추가 고려해보십시오

... 
df_list = [] 
api = finding(siteid='EBAY-GB',appid='some_id',config_file=None) 

for i in range(1,101): 
    print(i) 
    response = api.execute('findItemsByKeywords', 
          {'keywords': 'phone', 
          'outputSelector' : 'SellerInfo', 
          'paginationInput': {'entriesPerPage': '2', 
               'pageNumber': ' '+str(i)}})  

    soup = BeautifulSoup(response.content, 'lxml') 

    headers = ['itemid','title','categoryname','categoryid','postalcode','location', 
       'sellerusername','feedbackscore','positivefeedbackpercent','topratedseller', 
       'shippingservicecost','buyitnowavailable','currentprice','starttime', 
       'endtime','watchcount','conditionid'] 

    # LIST COMPREHENSION PARSING ELEMENTS OF API RESPONSE 
    values = [element.text for element in soup.find_all(obj) for obj in headers] 

    # DICT COMPREHENSION WITH ZIP TO DF THAT NAMES EACH COLUMN WITH VALUE & FILLS MISSING 
    tmp = pd.DataFrame({h:v if len(v) > 1 else v+[None] for h,v in zip(headers, values)}) 

    # APPENDS TO LIST 
    df_list.append(tmp) 

# ROW BINDS TO FINAL DF 
final_df = pd.concat(df_list, ignore_index=True) 
0
from ebaysdk.finding import Connection as finding 
from bs4 import BeautifulSoup 
import pandas as pd 

def flatten(lst): 
    for x in lst: 
     if isinstance(x, list): 
     for y in flatten(x): 
      yield y   
     else: 
      yield x 

full_dict = {} 
result = {} 

for i in range(1,101): 
print(i) 

    api = finding(siteid='EBAY-GB',appid='some key',config_file=None) 
    response = api.execute('findItemsByKeywords', {'keywords': 'phone', 'outputSelector' : 'SellerInfo', 
'paginationInput': {'entriesPerPage': '100','pageNumber': ' '+str(i)}})  

    soup = BeautifulSoup(response.content, 'lxml') 

    items = soup.find_all('item') 

    headers_tuple = ('itemid','title','categoryname','categoryid','postalcode','location','sellerusername','feedbackscore','positivefeedbackpercent','topratedseller','shippingservicecost','buyitnowavailable','currentprice','starttime','endtime','watchcount','conditionid') 

    data_dict = {} 

    for obj in headers_tuple: 
     x = [element.text for element in soup.find_all(obj)] 
     data_dict[obj] = x 
    for key in (data_dict.keys() | full_dict.keys()): 
     if key in data_dict: result.setdefault(key, []).append(data_dict[key]) 
     if key in full_dict: result.setdefault(key, []).append(full_dict[key]) 

final_dict = {k: list(flatten(v)) for k, v in result.items()} 
df = pd.DataFrame.from_dict(final_dict, orient='index') 
df = df.T 

이것은이다 대답은 내가 캠 누구에게나 관심이 있다면. 그것은 작동하지만 열 순서가 어떤 이유로 변경되면 나는 이유를 모르겠다. 모든 도움을 주셔서 감사합니다!

관련 문제