2015-02-03 15 views
5

से पांडा डेटाफ्रेम बनाना मैं जनगणना डेटा पुनर्प्राप्त करने के लिए एक एपीआई बना रहा हूं, लेकिन मुझे आउटपुट स्वरूपण में परेशानी हो रही है। मेरा प्रश्न वास्तव में दो में से एक है:एपीआई कॉल

1) मैं अपने API कॉल (आदर्श एक dataframe) कैसे सुधार कर सकते हैं, जिससे कि उत्पादन खूबसूरत है

या

2) मैं कैसे सूची में हेरफेर कर सकते हैं कि मुझे वर्तमान में ऐसा लगता है कि यह एक पांडा डेटाफ्रेम में है?

import requests 
import pandas as pd 
import numpy as np 

mytoken = "numbersandletters" 
# this is my API key, so unfortunately I can't provide it 

def state_data(token, variables, year = 2010, state = "*", survey = "sf1"): 
    state = [str(i) for i in state] 
    # make sure the input for state (integers) are strings 
    variables = ",".join(variables) # squish all the variables into one string 
    year = str(year) 
    combine = ["http://api.census.gov/data/", year, "/", survey, "?key=", mytoken, "&get=", variables, "&for=state:"] 
# make a list of all the components to construct a URL 
    incomplete_url = "".join(combine) # the URL without the state tackd on to the end 
    complete_url = map(lambda i: incomplete_url + i, state) # now the state is tacked on to the end; one URL per state or for "*" 
    r = [] 
    r = map(lambda i: requests.get(i), complete_url) 
# make an API call to each complete_url 
    data = map(lambda i: i.json(), r) 
print r 
print data 
print type(data) 
df = pd.DataFrame(data) 
print df 

फ़ंक्शन को कॉल का एक उदाहरण यह है, नीचे दिए गए उत्पादन के साथ:

यहाँ मैं अब तक है।

state_data(token = mytoken, state = [47, 48, 49, 50], variables = ["P0010001", "P0010001"]) 

में जिसके परिणामस्वरूप:

[<Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>] 


[[[u'P0010001', u'P0010001', u'state'], [u'6346105', u'6346105', u'47']], 
[[u'P0010001', u'P0010001', u'state'], [u'25145561', u'25145561', u'48']], 
[[u'P0010001', u'P0010001', u'state'], [u'2763885', u'2763885', u'49']], 
[[u'P0010001', u'P0010001', u'state'], [u'625741', u'625741', u'50']]] 

<type 'list'> 
         0       1 
0 [P0010001, P0010001, state] [6346105, 6346105, 47] 
1 [P0010001, P0010001, state] [25145561, 25145561, 48] 
2 [P0010001, P0010001, state] [2763885, 2763885, 49] 
3 [P0010001, P0010001, state]  [625741, 625741, 50] 

जबकि वांछित परिणाम होगा:

P0010001 P0010001 state 
0 6346105 6346105 47 
1 25145561 25145561 48 
2 2763885 2763885 49 
3 625741 625741 50 

Fwiw, आर में अनुरूप कोड के नीचे है। मैं एक पुस्तकालय मैं अजगर को आर में लिखी गई जानकारी का अनुवाद कर रहा हूँ:

state.data = function(token, state = "*", variables, year = 2010, survey = "sf1"){ 
    state = as.character(state) 
    variables = paste(variables, collapse = ",") 
    year = as.character(year) 
    my.url = matrix(paste("http://api.census.gov/data/", year, "/", survey, "?key=", token, 
        "&get=",variables, "&for=state:", state, sep = ""), ncol = 1) 

    process.url = apply(my.url, 1, function(x) process.api.data(fromJSON(file=url(x)))) 
    rbind.dat = data.frame(rbindlist(process.url)) 
    rbind.dat = rbind.dat[, c(tail(seq_len(ncol(rbind.dat)), 1), seq_len(ncol(rbind.dat) - 1))] 
    rbind.dat 
} 
+1

क्या आप एक उदाहरण दे सकते हैं कि मूल डेटा कैसा दिखता है (जिसे आप 'full_url' से पुनर्प्राप्त करते हैं? यदि यह जेसन है, हो सकता है कि आप 'pd.read_json' का उपयोग कर सकें? – joris

+0

मैंने एक' प्रिंट आर 'और आउटपुट जोड़ा। आर एक सूची है। – Nancy

उत्तर

2

ताकि आप डुप्लिकेट फ़ील्ड हैं, जो अतर्कसंगत है, और अपने परिणाम केवल दोहराया क्षेत्रों में से एक में दिखाई देंगे।

तथापि, तुम सब करने की जरूरत है pd.DataFrame निर्माता के लिए एक dict की list/iterable वस्तुओं पारित किया है, और आप अपने परिणाम होगा:

:

vals = [[[...]]] # the data you provided in your example 
df = pd.DataFrame(dict(zip(*v)) for v in vals) 

इस संभालने के लिए अपने डेटा है

data = [["P0010001","PCO0020019","state"], ["4779736","1204","01"], ["710231","53","02"], ["6392017","799","04"], ["2915918","924","05"], ["37253956","6244","06"], ["5029196","955","08"], ["3574097","1266","09"], ["897934","266","10"], ["601723","170","11"], ["18801310","4372","12"], ["9687653","1629","13"], ["1360301","251","15"], ["1567582","320","16"], ["12830632","3713","17"]] 

तो यह काम करता है:

df = pd.DataFrame(data[1:], columns=data[0]) 

इसलिए आपको यह पता लगाने की आवश्यकता होगी कि उस फ़ॉर्म में डेटा कैसे प्राप्त करें। मैं बस इतना कर रहा हूं कि सूचियों की सूची (data[1:]) और एक सूची (data[0])

+0

हाँ, अलग समस्या, और सरल: 'df = pd.DataFrame (डेटा [1:], कॉलम = डेटा [0]) ' – acushner

+0

और हाहा विशिष्ट ... – acushner

+0

ठीक है, मैं कोशिश करूँगा। मैंने अपने आर कोड को मूल प्रश्न में जोड़ा ताकि यह दिखाया जा सके कि मैं चीजें क्यों कर रहा हूं। मैं संदर्भित करने में मदद कर सकता हूं। – Nancy

संबंधित मुद्दे