2012-03-18 19 views
51

मैंने पांडा का उपयोग करके कुछ डेटा छेड़छाड़ की है और अब मैं बैच को डेटाबेस में वापस सहेजना चाहता हूं। इसके लिए मुझे डेटाफ्रेम को डेटाफ्रेम की "पंक्ति" से संबंधित प्रत्येक टुपल के साथ, tuples की सरणी में परिवर्तित करने की आवश्यकता है।पांडस डेटाफ्रेम को टुपल्स की सरणी में परिवर्तित करें

मेरे DataFrame कुछ दिखाई देता है:

In [182]: data_set 
Out[182]: 
    index data_date data_1 data_2 
0 14303 2012-02-17 24.75 25.03 
1 12009 2012-02-16 25.00 25.07 
2 11830 2012-02-15 24.99 25.15 
3 6274 2012-02-14 24.68 25.05 
4 2302 2012-02-13 24.62 24.77 
5 14085 2012-02-10 24.38 24.61 

मैं इसे पसंद tuples की एक सरणी के लिए कनवर्ट करना चाहते हैं:

[(datetime.date(2012,2,17),24.75,25.03), 
(datetime.date(2012,2,16),25.00,25.07), 
...etc. ] 

कैसे मैं कुशलता से ऐसा कर सकते हैं पर कोई भी सुझाव?

+1

2017+ में इस उत्तर में आने वाले लोगों के लिए, नीचे एक [नया idiomatic समाधान] है (https://stackoverflow.com/a/34551914/3707607)। आप केवल 'सूची (df.itertuples (अनुक्रमणिका = गलत, नाम = कोई नहीं) का उपयोग कर सकते हैं) ' –

उत्तर

96

कैसे के बारे में:

subset = data_set[['data_date', 'data_1', 'data_2']] 
tuples = [tuple(x) for x in subset.values] 
+1

धन्यवाद बहुत सारे वेस, जो समाधान के साथ आया था उससे बहुत साफ है। पांडों पर सामान्य रूप से महान काम, मैंने अभी सतह को खरोंच करना शुरू कर दिया है लेकिन यह बहुत अच्छा लग रहा है। – enrishi

+0

कृपया '.itertuples' का उपयोग करने के लिए नीचे @ ksindi का उत्तर देखें, जो मानों को सरणी के रूप में प्राप्त करने और उन्हें टुपल में टर्न करने से अधिक कुशल होगा। – vy32

31

एक सामान्य तरीका:

[tuple(x) for x in data_set.to_records(index=False)] 
31
list(data_set.itertuples(index=False)) 

17,1 के रूप में, इसके बाद के संस्करण namedtuples की एक सूची प्रदान करेगा - docs देखते हैं।

+4

यह स्वीकार्य उत्तर IMHO होना चाहिए (अब एक समर्पित विशेषता मौजूद है)। बीटीडब्लू, अगर आप अपने 'ज़िप' इटरेटर ('nametuple's के बजाय) में सामान्य 'tuple' चाहते हैं, तो कॉल करें: 'data_set.itertuples (अनुक्रमणिका = गलत, नाम = कोई नहीं)' – Axel

7

यहाँ एक vectorized तरीका है दिखाया गया है कि tuples के list रिटर्न (dataframe संभालने, data_set बजाय df रूप में परिभाषित किया जा करने के लिए):

>>> df.set_index(['data_date'])[['data_1', 'data_2']].to_records().tolist() 

पैदा करता है:

[(datetime.datetime(2012, 2, 17, 0, 0), 24.75, 25.03), 
(datetime.datetime(2012, 2, 16, 0, 0), 25.0, 25.07), 
(datetime.datetime(2012, 2, 15, 0, 0), 24.99, 25.15), 
(datetime.datetime(2012, 2, 14, 0, 0), 24.68, 25.05), 
(datetime.datetime(2012, 2, 13, 0, 0), 24.62, 24.77), 
(datetime.datetime(2012, 2, 10, 0, 0), 24.38, 24.61)] 

की स्थापना के विचार डेटाटाइम कॉलम के रूप में इंडेक्स अक्ष Timestamp के रूपांतरण में सहायता के लिए datetime.datetime प्रारूप के बराबर प्रारूप के बराबर है। ई convert_datetime64DF.to_records में तर्क जो DateTimeIndex डेटाफ़्रेम के लिए ऐसा करता है।

यह रिटर्न एक recarray जो तब बनाया जा सकता है .tolist


अधिक सामान्यीकृत उपयोग के मामले के आधार पर समाधान का उपयोग किया जाएगा एक list वापस जाने के लिए:

df.to_records().tolist()        # Supply index=False to exclude index 
2

अधिक pythonic तरीका:

df = data_set[['data_date', 'data_1', 'data_2']] 
map(tuple,df.values) 
10

प्रेरणा
कई डेटा सेट इतने बड़े हैं कि हमें गति/दक्षता के साथ खुद को चिंता करने की आवश्यकता है। तो मैं उस भावना में इस समाधान की पेशकश करता हूं। यह संक्षेप में भी होता है।

तुलना के लिए, के index स्तंभ ड्रॉप

df = data_set.drop('index', 1) 

समाधान
मैं zip के उपयोग और एक समझ

list(zip(*[df[c].values.tolist() for c in df])) 

[('2012-02-17', 24.75, 25.03), 
('2012-02-16', 25.0, 25.07), 
('2012-02-15', 24.99, 25.15), 
('2012-02-14', 24.68, 25.05), 
('2012-02-13', 24.62, 24.77), 
('2012-02-10', 24.38, 24.61)] 

यह भी होता है का प्रस्ताव देंगे लचीला अगर हम कॉलम के एक विशिष्ट सबसेट से निपटना चाहते थे। हम मान लेंगे कि हम पहले से प्रदर्शित किए गए कॉलम हैं जो हम चाहते हैं सबसेट हैं।

list(zip(*[df[c].values.tolist() for c in ['data_date', 'data_1', 'data_2'])) 

[('2012-02-17', 24.75, 25.03), 
('2012-02-16', 25.0, 25.07), 
('2012-02-15', 24.99, 25.15), 
('2012-02-14', 24.68, 25.05), 
('2012-02-13', 24.62, 24.77), 
('2012-02-10', 24.38, 24.61)] 

सभी निम्नलिखित उत्पादन एक ही परिणाम

  • [tuple(x) for x in df.values]
  • df.to_records(index=False).tolist()
  • list(map(tuple,df.values))
  • list(map(tuple, df.itertuples(index=False)))

तेज क्या है?
zip और समझ तेजी से एक बड़े अंतर से

%timeit [tuple(x) for x in df.values] 
%timeit list(map(tuple, df.itertuples(index=False))) 
%timeit df.to_records(index=False).tolist() 
%timeit list(map(tuple,df.values)) 
%timeit list(zip(*[df[c].values.tolist() for c in df])) 

छोटे डेटा

10000 loops, best of 3: 55.7 µs per loop 
1000 loops, best of 3: 596 µs per loop 
10000 loops, best of 3: 38.2 µs per loop 
10000 loops, best of 3: 54.3 µs per loop 
100000 loops, best of 3: 12.9 µs per loop 

बड़े डेटा

10 loops, best of 3: 58.8 ms per loop 
10 loops, best of 3: 43.9 ms per loop 
10 loops, best of 3: 29.3 ms per loop 
10 loops, best of 3: 53.7 ms per loop 
100 loops, best of 3: 6.09 ms per loop 
+0

आपने मेला नहीं बनाया तुलना। आपका समाधान 'सूची से अधिक तेज़ नहीं है (df.itertuples (अनुक्रमणिका = गलत, नाम = कोई नहीं)) '। यह जवाब सिर्फ लोगों को भ्रमित करेगा। अगर मैं तुम थे तो मैं इसे हटा दूंगा। –

+0

@TedPetrou यह उचित क्यों नहीं है? आपके द्वारा सुझाए गए किसी भी प्रस्ताव का प्रस्ताव नहीं है। आप इसे उत्तर के रूप में क्यों नहीं डालते हैं। दो जवाब पूरी समस्या को उजागर करने में मदद करते हैं। – piRSquared

+0

यह ठीक है: https://stackoverflow.com/a/34551914/3707607 –

0
है 10
+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/17575022) –

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