2014-05-09 14 views
9

द्वारा एसक्लाइट तालिका में पांडस डेटाफ्रेम को जोड़ना मैं 'न्यूटेबल' नामक स्क्लाइट डेटाबेस में मौजूदा तालिका में पांडस डेटाफ्रेम को जोड़ना चाहता हूं। न्यूटेबल में तीन फ़ील्ड हैं (आईडी, नाम, आयु) और आईडी प्राथमिक कुंजी है। मेरे डेटाबेस कनेक्शन:प्राथमिक कुंजी

import sqlite3 
DB='<path>' 
conn = sqlite3.connect(DB) 

dataframe मैं संलग्न करना चाहते हैं:

test=pd.DataFrame(columns=['ID','Name','Age']) 
test.loc[0,:]='L1','John',17 
test.loc[1,:]='L11','Joe',30 

ऊपर उल्लेख किया है, आईडी NewTable में प्राथमिक कुंजी है। कुंजी 'एल 1' पहले से ही न्यूटेबल में है, लेकिन कुंजी 'एल 11' नहीं है। मैं डेटाटेम को न्यूटेबल में जोड़ने की कोशिश करता हूं।

from pandas.io import sql 
sql.write_frame(test,name='NewTable',con=conn,if_exists='append') 

यह एक त्रुटि फेंकता है:

IntegrityError: column ID is not unique 

त्रुटि तथ्य यह है कि कुंजी 'एल 1' NewTable में पहले से ही है की संभावना है। डेटाफ्रेम में प्रविष्टियों में से कोई भी न्यूटेबल में शामिल नहीं है। लेकिन, मैं नई कुंजी के साथ डेटाफ्रेम को बिना किसी समस्या के न्यूटेबल में जोड़ सकता हूं।

क्या कोई आसान तरीका है (उदाहरण के लिए, लूपिंग के बिना) एक एसक्लाइट टेबल में पांडस डेटाफ्रेम जोड़ने के लिए, जैसे कि डेटाफ्रेम में नई कुंजियां संलग्न की गई हैं, लेकिन तालिका में पहले से मौजूद कुंजी नहीं हैं?

धन्यवाद।

+1

क्या इसके लायक है, यदि आप पाते हैं अपने आप को इस एक बहुत कुछ कर के लिए, SQLAlchemy अजगर से एसक्यूएल के साथ बातचीत के लिए एक महान उपकरण है। यदि आप इसके साथ सेट अप करते हैं, तो session.merge (पंक्ति) फ़ंक्शन ठीक वही करेगा, एक पंक्ति को मौजूदा प्राथमिक कुंजी के साथ बदलकर अन्यथा जोड़ना। – RussellStewart

+0

धन्यवाद। मैं sqlalchemy में देखेंगे। – lmart999

उत्तर

8

आप SQL कार्यक्षमता insert or replace

query=''' insert or replace into NewTable (ID,Name,Age) values (?,?,?) ''' 
conn.executemany(query, test.to_records(index=False)) 
conn.commit() 
+0

धन्यवाद, यह काम करता है। मामूली जोड़: तालिका संरचना से मेल खाने के लिए सूचकांक को रिकॉर्ड सरणी से बाहर रखा गया है। 'conn.executemany (क्वेरी, test.to_records (अनुक्रमणिका = गलत))' – lmart999

+0

यह सही है। मैं आम तौर पर डीएफ में इंडेक्स के रूप में प्राथमिक कुंजी का उपयोग करता हूं, इसलिए मैं इसे भूल गया। इस मामले में – Happy001

0

http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.io.sql.write_frame.html

उत्सुक उपयोग कर सकते हैं अगर आप replace की कोशिश की?

if_exists: {‘fail’, ‘replace’, ‘append’}, default ‘fail’ 
+0

'प्रतिस्थापन' काम नहीं करेगा क्योंकि यह जांच करेगा कि तालिका, रिकॉर्ड नहीं है, पहले से मौजूद है या नहीं। यदि ऐसा होता है, तो पूरी तालिका गिरा दी जाएगी और फिर नए डेटाफ्रेम के साथ फिर से बनाई जाएगी। –

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