2015-07-14 27 views
9

मैं एक df है। दस्तावेज (http://geopy.readthedocs.org/en/latest/#data) अलग-अलग स्थानों के लिए प्रलेखन के साथ काम करते समय बहुत सरल है।नया स्तंभ

>>> from geopy.geocoders import Nominatim 
>>> geolocator = Nominatim() 
>>> location = geolocator.geocode("175 5th Avenue NYC") 
>>> print(location.address) 
Flatiron Building, 175, 5th Avenue, Flatiron, New York, NYC, New York,  ... 
>>> print((location.latitude, location.longitude)) 
(40.7410861, -73.9896297241625) 
>>> print(location.raw) 
{'place_id': '9167009604', 'type': 'attraction', ...} 

हालांकि मैं डीएफ में प्रत्येक पंक्ति में फ़ंक्शन को लागू करना चाहता हूं और एक नया कॉलम बनाना चाहता हूं। मैं निम्नलिखित

df['city_coord'] = geolocator.geocode(lambda row: 'state_name' (row)) 

की कोशिश की है, लेकिन मुझे लगता है कि मैं अपने कोड में कुछ याद कर रहा हूँ क्योंकि मैं निम्नलिखित मिल:

city_name state_name county_name coordinates 
0 WASHINGTON DC DIST OF COLUMBIA None 
1 WASHINGTON DC DIST OF COLUMBIA None 
2 WASHINGTON DC DIST OF COLUMBIA None 
3 WASHINGTON DC DIST OF COLUMBIA None 
4 WASHINGTON DC DIST OF COLUMBIA None 
5 WASHINGTON DC DIST OF COLUMBIA None 
6 WASHINGTON DC DIST OF COLUMBIA None 
7 WASHINGTON DC DIST OF COLUMBIA None 
8 WASHINGTON DC DIST OF COLUMBIA None 
9 WASHINGTON DC DIST OF COLUMBIA None 

मैं उम्मीद है कि लैम्ब्डा समारोह का उपयोग कर कुछ इस तरह करना चाहते हैं:

 city_name state_name county_name city_coord 
0 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
1 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
2 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
3 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
4 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
5 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
6 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
7 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
8 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
9 WASHINGTON DC DIST OF COLUMBIA 38.8949549, -77.0366456 
10 GLYNCO  GA GLYNN    31.2224512, -81.5101023 

मैं किसी भी मदद की सराहना करता हूं। निर्देशांक प्राप्त करने के बाद मैं उन्हें मानचित्र बनाना चाहता हूं। मैपिंग निर्देशांक के लिए किसी भी अनुशंसित संसाधनों की भी सराहना की जाती है। धन्यवाद

+0

'df ['city_Coord'] = df ['state_name'] आज़माएं। (Geolocator.geocode) ' – EdChum

उत्तर

9

आप apply कॉल और समारोह आप की तरह हर पंक्ति पर अमल करने के लिए चाहते हैं पारित कर सकते हैं निम्नलिखित:

In [9]: 

geolocator = Nominatim() 
df['city_coord'] = df['state_name'].apply(geolocator.geocode) 
df 
Out[9]: 
    city_name state_name  county_name \ 
0 WASHINGTON   DC DIST OF COLUMBIA 
1 WASHINGTON   DC DIST OF COLUMBIA 

              city_coord 
0 (District of Columbia, United States of Americ... 
1 (District of Columbia, United States of Americ... 

फिर आप अक्षांश और देशांतर का उपयोग गुण कर सकते हैं:

In [16]: 

df['city_coord'] = df['city_coord'].apply(lambda x: (x.latitude, x.longitude)) 
df 
Out[16]: 
    city_name state_name  county_name      city_coord 
0 WASHINGTON   DC DIST OF COLUMBIA (38.8937154, -76.9877934586326) 
1 WASHINGTON   DC DIST OF COLUMBIA (38.8937154, -76.9877934586326) 

या करना चाहते हैं यह apply को दो बार कॉल करके एक लाइनर में:

In [17]: 
df['city_coord'] = df['state_name'].apply(geolocator.geocode).apply(lambda x: (x.latitude, x.longitude)) 
df 

Out[17]: 
    city_name state_name  county_name      city_coord 
0 WASHINGTON   DC DIST OF COLUMBIA (38.8937154, -76.9877934586326) 
1 WASHINGTON   DC DIST OF COLUMBIA (38.8937154, -76.9877934586326) 

इसके अलावा अपने प्रयास geolocator.geocode(lambda row: 'state_name' (row)) कारण है कि आप एक स्तंभ None मूल्यों

संपादित

@leb, यहाँ एक दिलचस्प बात करता है तो आप कई डुप्लिकेट मानों तो यह करने के लिए अधिक performant हो जाएगा से भरा है इसलिए कुछ नहीं किया प्रत्येक अद्वितीय मान के जियोकोड और फिर इस जोड़ने: तो ऊपर unique का उपयोग करके सभी अनन्य मानों हो जाता है

In [38]: 
states = df['state_name'].unique() 
d = dict(zip(states, pd.Series(states).apply(geolocator.geocode).apply(lambda x: (x.latitude, x.longitude)))) 
d 

Out[38]: 
{'DC': (38.8937154, -76.9877934586326)} 

In [40]:  
df['city_coord'] = df['state_name'].map(d) 
df 

Out[40]: 
    city_name state_name  county_name      city_coord 
0 WASHINGTON   DC DIST OF COLUMBIA (38.8937154, -76.9877934586326) 
1 WASHINGTON   DC DIST OF COLUMBIA (38.8937154, -76.9877934586326) 

, उनमें से एक dict निर्माण करती है और उसके बाद map कॉल देखने और विज्ञापन प्रदर्शन करने के लिए डी कॉरर्स, यह पंक्ति-वार

+0

मुझे यह त्रुटि अभी भी मिल रही है: GeocoderTimedOut: सेवा का समय समाप्त हो गया। क्या यह कुछ है जो मैं अपने अंत में कर रहा हूं? – david

+0

क्या आपको यह त्रुटि मेरे मूल कोड या अनुकूलित संस्करण के साथ मिल रही है? यदि भौगोलिक समय – EdChum

3

@ gechode geekode करने की कोशिश करने से अधिक कुशल होगा और @ EdChum के उत्तर को स्वीकार करें, मैं बस इसे जोड़ना चाहता था।उनकी विधियां सही काम करती हैं, लेकिन व्यक्तिगत अनुभव से मैं कुछ चीजें साझा करना चाहता हूं:

जियोकोडिंग से निपटने पर, यदि आपके पास दोहराए जाने वाले कई शहर/राज्य संयोजन हैं, तो यह अधिक तेज़ केवल 1 को भेजने के लिए है जिओकोड और फिर नीचे अन्य पंक्तियों के बाकी को दोहराने:

यह बहुत बड़े डेटा के लिए उपयोगी के दो तरीकों से किया जा सकता है:

  1. अपने डेटा के आधार पर ही के बाद से पंक्तियों सटीक नकल लगते, और केवल अगर आप चाहते हैं, तो अतिरिक्त और पूर्व छोड़ दें उनमें से एक को पारिस्थितिक geocoding। यह drop_duplicate
  2. का उपयोग करके किया जा सकता है यदि आप अपनी सभी पंक्तियां, group_by शहर/राज्य संयोजन को रखना चाहते हैं, तो head(1) पर कॉल करके पहले व्यक्ति को जियोकोडिंग लागू करें, फिर शेष पंक्तियों पर डुप्लिकेट करें।

प्रत्येक बार जब आप नोमिनाटिम पर कॉल करते हैं तो एक छोटी विलंबता समस्या होती है, भले ही आप एक ही शहर/राज्य को पंक्ति में छोड़ रहे हों। यह छोटा विलंबता तब खराब हो जाती है जब आपका डेटा बड़ा हो जाता है जिससे प्रतिक्रिया और संभावित समय में भारी देरी होती है।

फिर से, यह व्यक्तिगत रूप से इससे निपटने से है। भविष्य में उपयोग के लिए बस ध्यान रखें यदि इससे आपको लाभ नहीं होता है।

+1

का समय समाप्त हो रहा है, तो आपको अपने डेटा को संसाधित करना पड़ सकता है, यह एक दिलचस्प बात है, शायद यह अद्वितीय मूल्य प्राप्त करने के लिए बेहतर है, उन्हें जियोकोड करें और इन्हें वापस विलय करें, मैं अपना जवाब – EdChum

+0

अपडेट कर दूंगा। अविश्वसनीय रूप से उपयोगी जानकारी! हालांकि जब मैंने डेटा की पंक्तियों [: 5] पंक्तियों को देखा तो मुझे एक अच्छा डेटाफ्रेम मिला। जब मैंने फ़ंक्शन को सभी (200,000 रिकॉर्ड) पर लागू किया तो मुझे एक समय त्रुटि मिली। मुझे समूहबद्ध करना होगा और फिर आवेदन करना होगा। आपका बहुत बहुत धन्यवाद। – david

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