(पंक्ति, कॉल, मान) के ट्यूपल्स की सूची से पांडा डेटाफ़्रेम का निर्माण करें


81

मेरे पास टुपल्स की सूची है जैसे

data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]

और मैं उन्हें पहले कॉलम और 2 कॉलम द्वारा नामित स्तंभों वाली पंक्तियों के साथ एक पांडा डेटाफ़्रेम में डालना चाहूंगा। ऐसा लगता है कि पंक्ति के नामों की देखभाल करने का तरीका कुछ ऐसा है, pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])लेकिन मैं 2x2 मैट्रिक्स (पिछले सेट से आउटपुट 3x4) प्राप्त करने के लिए कॉलम की देखभाल कैसे करूं? क्या स्पष्ट रूप से उन्हें छोड़ने के बजाय पंक्ति लेबलों की देखभाल करने का अधिक बुद्धिमान तरीका है?

संपादित करें ऐसा लगता है कि मुझे 2 डेटाफ्रेम की आवश्यकता होगी - औसत के लिए एक और मानक विचलन के लिए एक, क्या यह सही है? या क्या मैं प्रत्येक "सेल" में मूल्यों की सूची संग्रहीत कर सकता हूं?


1
की निश्चित डुप्लिकेट < stackoverflow.com/questions/11415701/... >
Ely

2
@EMS बिल्कुल नहीं। मैंने उस प्रश्न को देखा, उसे 2 डी धुरी की आवश्यकता नहीं थी।
gt6989b

मैं असहमत हूं - मुझे लगता है कि आप डेटाफ़्रेम में डेटा स्टैक करने के सही तरीके से अपरिचित हैं। आमतौर पर, आप में जानकारी का उपयोग करना चाहें दोनों , अपने कॉलम 1 और स्तंभ 2 के रूप में अनुक्रमित ताकि आप जल्दी से या तो द्वारा डेटा के लिए खोज सकते हैं। कॉलम 2 में चीजें कॉलम नामों के रूप में नहीं हैं, लेकिन फिर भी अगर वे ऐसा करते हैं, तो यह आपके पोस्ट के शीर्षक से पूरी तरह से अलग प्रश्न है। मुझे लगता है कि शीर्षक का संपादन मदद कर सकता है (हालांकि मुझे अभी भी लगता है कि यह सार्थक रूप से अलग प्रश्न नहीं है)।
एलवी

1
@ely, gt6989b मैंने इसे "(... पंक्ति, बृहदान्त्र, मान) के टुपल्स की सूची से" यह स्पष्ट करने के लिए "क्यों यह डुप्लिकेट नहीं है ..."
टुपल्स

जवाबों:


65

बनाने के बाद आप अपने डेटाफ़्रेम को पिवट कर सकते हैं:

>>> df = pd.DataFrame(data)
>>> df.pivot(index=0, columns=1, values=2)
# avg DataFrame
1      c1     c2
0               
r1  avg11  avg12
r2  avg21  avg22
>>> df.pivot(index=0, columns=1, values=3)
# stdev DataFrame
1        c1       c2
0                   
r1  stdev11  stdev12
r2  stdev21  stdev22

3
0नाम के साथ इंडेक्स और कॉलम वाली पंक्ति 1बहुत सुंदर नहीं है ...
drevicko

49

मैं प्रस्तुत करता हूं कि अपने डेटा को छोड़ देना बेहतर है क्योंकि यह है:

df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std'])

# Possibly also this if these can always be the indexes:
# df = df.set_index(['R_Number', 'C_Number'])

तब यह कहना थोड़ा अधिक सहज है

df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)

इस तरह यह निहित है कि आप औसत, या मानक विचलन को फिर से खोलना चाहते हैं। जबकि, सिर्फ उपयोग करते हुए pivot, यह विशुद्ध रूप से कॉलम कन्वेंशन पर आधारित है कि यह शब्दार्थ इकाई क्या है जिससे आप पुन: आकार ले रहे हैं।


1
+1, उपयोगी खोजकर्ता। मुझे स्पष्ट रूप से एक 2D तालिका में दिलचस्पी है - मुझे पंक्ति और स्तंभ-सूचियों, दोनों के साथ-साथ प्रत्येक आयाम को अलग-अलग एक्सेस करने के लिए, मूल्यों की खोज करने की अनुमति देने के लिए। क्या आप स्टैक्ड डेटा के साथ ऐसा कर सकते हैं?
gt6989b

2
हां। ढेर डेटा के साथ बेहतर है। SQL में एक रिलेशनल डेटाबेस टेबल के बारे में सोचें। आप बार-बार स्तंभों के एक समूह में एक पूरे स्तंभ को उड़ाने नहीं जाते हैं? यह केवल विशेष मामलों में होना चाहिए (मुझे लगता है कि यह लंबा-चौड़ा पैटर्न है)। आम तौर पर, आप कई स्तंभों को अनुक्रमणिका के रूप में मानते हैं, और एक विशिष्ट अभिलेख प्राप्त करने के लिए अनुक्रमणिका स्तंभों में से किसी एक को आंशिक रूप से बांधकर या सभी को बांधकर चयन करते हैं।
Ely

2
इसलिए, आपके मामले में, उदाहरण के लिए, इंडेक्स को सेट करने के बाद [R_Number, C_Number]आप कर सकते हैं df.ix[('r1','c2')]। : या आप नियमित रूप से कॉलम के रूप में उन दोनों को छोड़ सकते हैं और प्रयोग तार्किक अनुक्रमणdf[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
Ely

2
आम तौर पर, आप जो करने की कोशिश कर रहे हैं उसे करने के लिए मुख्य उपयोग का मामला pivotतब है जब आप कुछ तालिका प्रारूपित कर रहे हैं ताकि यह स्क्रीन पर अच्छी तरह से प्रिंट हो, या HTML, LaTeX, या .csv, या कुछ और के लिए अच्छी तरह से निर्यात किया जाता है। जैसे एक तालिका को प्रारूपित करना जो एक प्रस्तुति या लेख प्रस्तुत करने में जाएगी। अन्यथा, जहाँ तक डेटा को कुशलता से हेरफेर करने के लिए, आप चाहते हैं कि चीजें मल्टी-इंडेक्स हों जब आप कर सकते हैं (जैसे डेटाबेस टेबल की कुंजी) या कम से कम बार-बार कॉलम ताकि आप कुशल इंडेक्सिंग और जॉइनिंग आदि कर सकें, लेकिन आप नहीं करते हैं उन्हें अपने स्वयं के स्तंभों में उड़ाना चाहते हैं।
Ely

35

जब मैंने इस सवाल पर आये तो मुझे यही देखने की उम्मीद थी:

#!/usr/bin/env python

import pandas as pd


df = pd.DataFrame([(1, 2, 3, 4),
                   (5, 6, 7, 8),
                   (9, 0, 1, 2),
                   (3, 4, 5, 6)],
                  columns=list('abcd'),
                  index=['India', 'France', 'England', 'Germany'])
print(df)

देता है

         a  b  c  d
India    1  2  3  4
France   5  6  7  8
England  9  0  1  2
Germany  3  4  5  6

आपने प्रश्न को गलत बताया। मूल रूप से प्रश्न में दिए गए डेटा में प्रश्न में प्रत्येक रिकॉर्ड के लिए पहले से ही पंक्ति और स्तंभ लेबल हैं।
gt6989b

11
@ gt6989b नहीं, मैंने नहीं किया। मैंने मूल प्रश्न का उत्तर देने की कोशिश नहीं की, लेकिन जब वे इस पृष्ठ पर आते हैं, तो प्रश्न (लोग) हो सकते हैं।
मार्टिन थूमा

8
@MartinThoma धन्यवाद, वास्तव में यह वही है जो मैं इस पृष्ठ पर खोज रहा हूँ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.