कैसे अच्छा प्रतिलिपि प्रस्तुत करने योग्य पांडा उदाहरण बनाने के लिए


221

दोनों समय देखने के लिए एक सभ्य राशि खर्च करते हैं तथा एसओ पर टैग, मुझे जो धारणा मिलती है वह यह है कि pandasप्रश्नों में प्रजनन योग्य डेटा होने की संभावना कम होती है। यह कुछ ऐसा है जो आर समुदाय को प्रोत्साहित करने के बारे में बहुत अच्छा रहा है, और इस तरह के मार्गदर्शकों के लिए धन्यवाद , नवागंतुक इन उदाहरणों को एक साथ रखने पर कुछ मदद प्राप्त करने में सक्षम हैं। जो लोग इन गाइडों को पढ़ने में सक्षम हैं और प्रतिलिपि प्रस्तुत करने योग्य डेटा के साथ वापस आते हैं, उनके सवालों के जवाब पाने में अक्सर बहुत बेहतर किस्मत होगी।

हम pandasप्रश्नों के लिए अच्छे प्रजनन योग्य उदाहरण कैसे बना सकते हैं ? सरल डेटाफ्रेम को एक साथ रखा जा सकता है, जैसे:

import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'], 
                   'income': [40000, 50000, 42000]})

लेकिन कई उदाहरण डेटासेट को अधिक जटिल संरचना की आवश्यकता होती है, उदाहरण के लिए:

  • datetime सूचकांक या डेटा
  • एकाधिक श्रेणीगत चर (क्या आर के expand.grid()फ़ंक्शन के बराबर है , जो कुछ दिए गए चर के सभी संभव संयोजनों का उत्पादन करता है?)
  • मल्टीआंडेक्स या पैनल डेटा

डेटासेट्स के लिए, जो कोड की कुछ पंक्तियों का उपयोग करके मज़ाक करना मुश्किल है, क्या R के बराबर dput()है जो आपको अपने डेटास्ट्रेक्चर को पुन: उत्पन्न करने के लिए कॉपी-पेस्ट करने योग्य कोड उत्पन्न करने की अनुमति देता है?


8
यदि आप मुद्रण के आउटपुट की प्रतिलिपि बनाते हैं, तो अधिकांश समय उत्तरदाता read_clipboard () ... का उपयोग कर सकते हैं सिवाय MultiIndex: s के लिए। यह कहते हुए कि, तानाशाह अच्छा है
एंडी हेडन

8
एंडी ने जो कहा, इसके अलावा, मुझे लगता है कि कॉपी-पेस्टिंग df.head(N).to_dict(), जहां Nकुछ उचित संख्या है वहां जाना एक अच्छा तरीका है। आउटपुट में सुंदर-लाइन विराम जोड़ने के लिए बोनस + 1। टाइमस्टैम्प के लिए, आपको आमतौर पर from pandas import Timestampकोड के शीर्ष पर जोड़ना होगा।
पॉल एच

जवाबों:


323

नोट: यहां विचार ढेर अतिप्रवाह के लिए बहुत सामान्य हैं, वास्तव में प्रश्न

डिस्क्लेमर: एक अच्छा प्रश्न लिखना HARD है।

अच्छा:

  • क्या छोटे * उदाहरण DataFrame को या तो रन करने योग्य कोड के रूप में शामिल करें:

    In [1]: df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])

    या इसे "कॉपी और पेस्ट करने योग्य" का उपयोग करके बना pd.read_clipboard(sep='\s\s+')सकते हैं, आप स्टैक ओवरफ्लो हाइलाइट के लिए पाठ को प्रारूपित कर सकते हैं और Ctrl+ K(या प्रत्येक पंक्ति में चार रिक्त स्थान का उपयोग कर सकते हैं ), या अपने कोड के साथ अपने कोड के ऊपर और नीचे तीन टिल्डों को बिना किसी बाधा के रख सकते हैं:

    In [2]: df
    Out[2]: 
       A  B
    0  1  2
    1  1  3
    2  4  6
    

    परीक्षण pd.read_clipboard(sep='\s\s+')अपने आप को।

    * मैं वास्तव में छोटा मतलब है , उदाहरण के विशाल बहुमत DataFrames जरूरत से कम 6 पंक्तियों प्रशस्ति पत्र हो सकता है , और मुझे यकीन है कि मैं इसे 5 पंक्तियों में कर सकते हैं। क्या आप त्रुटि को पुन: उत्पन्न कर सकते हैं df = df.head(), यदि यह देखने के लिए चारों ओर फ़िफ़ल नहीं है कि क्या आप एक छोटा डेटाफ़्रेम बना सकते हैं जो आपके द्वारा सामना की जा रही समस्या को प्रदर्शित करता है।

    * हर नियम में एक अपवाद होता है, स्पष्ट एक प्रदर्शन के मुद्दों के लिए होता है ( जिस स्थिति में निश्चित रूप से% समय और संभवतः% प्रून का उपयोग होता है), जहां आपको उत्पन्न होना चाहिए (np.random.seed का उपयोग करने पर विचार करें ताकि हमारे पास एक ही फ्रेम हो) df = pd.DataFrame(np.random.randn(100000000, 10))। यह कहते हुए कि, "इस कोड को मेरे लिए जल्दी बनाएं" साइट के लिए विषय पर कड़ाई नहीं है ...

  • अपनी इच्छानुसार परिणाम लिखें (ऊपर भी इसी तरह)

    In [3]: iwantthis
    Out[3]: 
       A  B
    0  1  5
    1  4  6
    

    यह बताएं कि संख्याएँ कहाँ से आती हैं: 5 उन पंक्तियों के लिए B कॉलम का योग है जहाँ A 1 है।

  • वह कोड दिखाएं जो आपने आज़माया है:

    In [4]: df.groupby('A').sum()
    Out[4]: 
       B
    A   
    1  5
    4  6
    

    लेकिन कहते हैं कि क्या गलत है: एक स्तंभ एक स्तंभ के बजाय सूचकांक में है।

  • क्या आपने कुछ शोध किया है ( डॉक्स खोजें , StackOverflow खोजें ), एक सारांश दें:

    योग के लिए docstring केवल "समूह मानों की गणना योग" बताता है

    GroupBy डॉक्स इस के लिए किसी भी उदाहरण देना नहीं है।

    एक तरफ: यहां जवाब का उपयोग करना है df.groupby('A', as_index=False).sum()

  • यदि यह प्रासंगिक है कि आपके पास टाइमस्टैम्प कॉलम हैं, उदाहरण के लिए, आप फिर से कर रहे हैं या कुछ और कर रहे हैं, तो स्पष्ट रहें और pd.to_datetimeअच्छे उपाय के लिए उन पर लागू करें।

    df['date'] = pd.to_datetime(df['date']) # this column ought to be date..

    ** कभी-कभी यह स्वयं मुद्दा है: वे तार थे।

खराब:

  • एक MultiIndex को शामिल न करें, जिसे हम कॉपी और पेस्ट नहीं कर सकते (ऊपर देखें), यह एक तरह की शिकायत है पंडों के डिफ़ॉल्ट प्रदर्शन के साथ लेकिन फिर भी कष्टप्रद है:

    In [11]: df
    Out[11]:
         C
    A B   
    1 2  3
      2  6
    

    सही तरीका एक set_indexकॉल के साथ एक सामान्य DataFrame शामिल करना है :

    In [12]: df = pd.DataFrame([[1, 2, 3], [1, 2, 6]], columns=['A', 'B', 'C']).set_index(['A', 'B'])
    
    In [13]: df
    Out[13]: 
         C
    A B   
    1 2  3
      2  6
    
  • जब आप चाहते हैं परिणाम दे रहा है यह जानकारी प्रदान करते हैं:

       B
    A   
    1  1
    5  0
    

    इस बारे में विशिष्ट रहें कि आपको नंबर कैसे मिले (वे क्या हैं) ... दोहरी जांच वे सही हैं।

  • यदि आपका कोड एक त्रुटि फेंकता है, तो पूरे स्टैक ट्रेस को शामिल करें (इसे बाद में संपादित किया जा सकता है यदि यह बहुत शोर है)। लाइन नंबर (और आपके कोड की संबंधित लाइन जिसे वह उठा रहा है) दिखाएं।

बदसूरत:

  • ऐसे CSV से लिंक न करें जिसकी हमारे पास पहुँच नहीं है (आदर्श रूप से किसी बाहरी स्रोत से लिंक नहीं है ...)

    df = pd.read_csv('my_secret_file.csv')  # ideally with lots of parsing options

    अधिकांश डेटा स्वामित्व है जो हमें मिलता है: समान डेटा बनाएं और देखें कि क्या आप समस्या (कुछ छोटा) को पुन: उत्पन्न कर सकते हैं।

  • स्थिति को शब्दों में स्पष्ट न करें, जैसे कि आपके पास एक DataFrame है जो "बड़ी" है, गुजरने में कुछ स्तंभ नामों का उल्लेख करें (सुनिश्चित करें कि उनके dtypes का उल्लेख नहीं करना है)। कोशिश करें और वास्तविक संदर्भ को देखे बिना किसी चीज के बारे में बहुत विस्तार करें। संभवतः कोई भी इस अनुच्छेद के अंत तक पढ़ने वाला नहीं है।

    निबंध खराब हैं, छोटे उदाहरणों के साथ यह आसान है।

  • अपने वास्तविक प्रश्न से पहले 10 + (100+ ??) डेटा की पंक्तियों को शामिल न करें।

    कृपया, हम अपने दिन के नौकरियों में इसे पर्याप्त देखें। हम मदद करना चाहते हैं, लेकिन इस तरह नहीं ...
    इंट्रो को काटें, और केवल संबंधित डेटाफ्रेम (या उनमें से छोटे संस्करण) को उस चरण में दिखाएं जो आपको परेशान कर रहा है।

वैसे भी, अजगर, नुम्पी और पंडों को सीखने में मज़ा आता है!


30
pd.read_clipboard(sep='\s\s+')टिप के लिए +1 । जब मैं SO प्रश्नों को पोस्ट करता हूं, जिन्हें एक विशेष लेकिन आसानी से साझा की गई डेटाफ़्रेम की आवश्यकता होती है, जैसे कि मैं इसे एक्सेल में बनाता हूं, इसे मेरे क्लिपबोर्ड पर कॉपी करता हूं, फिर SOers को भी ऐसा करने का निर्देश देता हूं। इतना समय बचता है!
zelusp

1
pd.read_clipboard(sep='\s\s+')यदि आप एक दूरस्थ सर्वर है, जो जहां बड़े डेटा सेट का एक बहुत रहते हैं पर अजगर का उपयोग कर रहे सुझाव काम करने के लिए प्रतीत नहीं होता।
user5359531

1
क्यों pd.read_clipboard(sep='\s\s+'), और सरल नहीं pd.read_clipboard()(डिफ़ॉल्ट के साथ ‘s+’)? पहली आवश्यकता कम से कम 2 व्हाट्सएप वर्णों की है, जो कि समस्या हो सकती है यदि केवल 1 है (उदाहरण @JohnE के उत्तर में ऐसा देखें )।
मैरिएनड

3
@MarianD का कारण यह है कि \ _ \ _ इतना लोकप्रिय है कि अक्सर एक स्तंभ नाम में एक उदाहरण होता है, लेकिन एकाधिक दुर्लभ होता है, और पांडा उत्पादन अच्छी तरह से स्तंभों के बीच कम से कम दो में डालता है। चूंकि यह सिर्फ खिलौना / छोटे डेटासेट के लिए है, यह बहुत शक्तिशाली / अधिकांश मामलों में है। नोट: अलग टैब एक अलग कहानी होगी, हालांकि स्टैकओवरफ्लो रिक्त स्थान के साथ टैब को बदल देता है, लेकिन यदि आपके पास एक tsv है तो बस \ t का उपयोग करें।
एंडी हेडन

3
ऊ, मैं हमेशा उपयोग करता हूं pd.read_clipboard(), जब उनके स्थान होते हैं, मैं करता हूं pd.read_clipboard(sep='\s+{2,}', engine='python'): पी
यू 10-फॉरवर्ड

72

सैंपल डेटासेट कैसे बनाएं

यह मुख्य रूप से @ AndyHayden के उत्तर पर विस्तार करने के लिए है कि आप नमूना डेटाफ्रेम कैसे बना सकते हैं। पंडों और (विशेष रूप से) सुन्न आपको इसके लिए कई प्रकार के उपकरण प्रदान करते हैं, जिससे आप आम तौर पर कोड की कुछ पंक्तियों के साथ किसी भी वास्तविक डेटासेट का एक उचित प्रतिकृति बना सकते हैं।

सुन्न और पंडों को आयात करने के बाद, एक यादृच्छिक बीज प्रदान करना सुनिश्चित करें यदि आप चाहते हैं कि लोग आपके डेटा और परिणामों को बिल्कुल पुन: पेश करने में सक्षम हों।

import numpy as np
import pandas as pd

np.random.seed(123)

एक रसोई सिंक उदाहरण

यहां एक उदाहरण है जो विभिन्न प्रकार की चीजें दिखा रहा है जो आप कर सकते हैं। सभी प्रकार के उपयोगी नमूना डेटाफ्रेम इसके सबसेट से बनाए जा सकते हैं:

df = pd.DataFrame({ 

    # some ways to create random data
    'a':np.random.randn(6),
    'b':np.random.choice( [5,7,np.nan], 6),
    'c':np.random.choice( ['panda','python','shark'], 6),

    # some ways to create systematic groups for indexing or groupby
    # this is similar to r's expand.grid(), see note 2 below
    'd':np.repeat( range(3), 2 ),
    'e':np.tile(   range(2), 3 ),

    # a date range and set of random dates
    'f':pd.date_range('1/1/2011', periods=6, freq='D'),
    'g':np.random.choice( pd.date_range('1/1/2011', periods=365, 
                          freq='D'), 6, replace=False) 
    })

यह उत्पादन करता है:

          a   b       c  d  e          f          g
0 -1.085631 NaN   panda  0  0 2011-01-01 2011-08-12
1  0.997345   7   shark  0  1 2011-01-02 2011-11-10
2  0.282978   5   panda  1  0 2011-01-03 2011-10-30
3 -1.506295   7  python  1  1 2011-01-04 2011-09-07
4 -0.578600 NaN   shark  2  0 2011-01-05 2011-02-27
5  1.651437   7  python  2  1 2011-01-06 2011-02-03

कुछ नोट:

  1. np.repeatऔर np.tile(कॉलम dऔर e) बहुत ही नियमित तरीके से समूह और सूचकांक बनाने के लिए बहुत उपयोगी हैं। 2 स्तंभों के लिए, इसका उपयोग आसानी से आर की नकल करने के लिए किया जा सकता है, expand.grid()लेकिन सभी क्रमपरिवर्तन का सबसेट प्रदान करने की क्षमता में अधिक लचीला भी है। हालाँकि, 3 या अधिक स्तंभों के लिए वाक्य रचना जल्दी से अस्पष्ट हो जाती है।
  2. आर के लिए एक और अधिक प्रत्यक्ष प्रतिस्थापन के लिए expand.grid()देख itertoolsमें समाधान पांडा रसोई की किताब या np.meshgridसमाधान दिखाया यहाँ । वे किसी भी संख्या में आयामों की अनुमति देंगे।
  3. आप काफी कुछ कर सकते हैं np.random.choice। उदाहरण के लिए, कॉलम में g, हमारे पास 2011 से 6 तारीखों का एक यादृच्छिक चयन है। इसके अतिरिक्त, replace=Falseहम यह आश्वस्त कर सकते हैं कि ये तिथियां अद्वितीय हैं - यदि हम इसे अनूठे मूल्यों वाले सूचकांक के रूप में उपयोग करना चाहते हैं, तो यह बहुत आसान है।

नकली स्टॉक मार्केट डेटा

उपरोक्त कोड के सबसेट लेने के अलावा, आप कुछ भी करने के लिए तकनीकों को आगे जोड़ सकते हैं। उदाहरण के लिए, यहां एक छोटा उदाहरण है जो समान तारीखों को कवर करने वाले 4 शेयरों के लिए नमूना टिकर डेटा बनाता है np.tileऔर date_rangeबनाता है:

stocks = pd.DataFrame({ 
    'ticker':np.repeat( ['aapl','goog','yhoo','msft'], 25 ),
    'date':np.tile( pd.date_range('1/1/2011', periods=25, freq='D'), 4 ),
    'price':(np.random.randn(100).cumsum() + 10) })

अब हमारे पास 100 लाइनों (25 टिक प्रति प्रति तारीख) के साथ एक नमूना डेटासेट है, लेकिन हमने इसे करने के लिए केवल 4 लाइनों का उपयोग किया है, जिससे कोड की 100 पंक्तियों को कॉपी और पेस्ट किए बिना हर किसी के लिए पुन: पेश करना आसान हो जाता है। यदि आप अपने प्रश्न को समझाने में मदद करते हैं तो आप डेटा के सबसेट प्रदर्शित कर सकते हैं:

>>> stocks.head(5)

        date      price ticker
0 2011-01-01   9.497412   aapl
1 2011-01-02  10.261908   aapl
2 2011-01-03   9.438538   aapl
3 2011-01-04   9.515958   aapl
4 2011-01-05   7.554070   aapl

>>> stocks.groupby('ticker').head(2)

         date      price ticker
0  2011-01-01   9.497412   aapl
1  2011-01-02  10.261908   aapl
25 2011-01-01   8.277772   goog
26 2011-01-02   7.714916   goog
50 2011-01-01   5.613023   yhoo
51 2011-01-02   6.397686   yhoo
75 2011-01-01  11.736584   msft
76 2011-01-02  11.944519   msft

2
बहुत बढ़िया जवाब। इस प्रश्न को लिखने के बाद मैंने वास्तव में एक बहुत ही छोटा, सरल कार्यान्वयन किया, expand.grid()जो कि पांडा कुकबुक में शामिल है , आप इसे अपने उत्तर में भी शामिल कर सकते हैं। आपके उत्तर से पता चलता है कि मेरे expand_grid()फ़ंक्शन से अधिक जटिल डेटासेट कैसे बनाए जा सकते हैं, जो महान हो सकता है।
मारीस

46

एक उत्तरदाता की डायरी

सवाल पूछने के लिए मेरी सबसे अच्छी सलाह होगी कि आप उन लोगों के मनोविज्ञान पर खेलें, जो सवालों के जवाब देते हैं। उन लोगों में से एक होने के नाते, मैं अंतर्दृष्टि दे सकता हूं कि मैं कुछ सवालों के जवाब क्यों देता हूं और मैं दूसरों का जवाब क्यों नहीं देता।

मंशा

मैं कई कारणों से सवालों के जवाब देने के लिए प्रेरित हूं

  1. Stackoverflow.com मेरे लिए एक बहुत मूल्यवान संसाधन रहा है। मैं वापस देना चाहता था।
  2. वापस देने के मेरे प्रयासों में, मैंने इस साइट को पहले से भी अधिक शक्तिशाली संसाधन पाया है। सवालों के जवाब देना मेरे लिए एक सीखने का अनुभव है और मुझे सीखना पसंद है। इस उत्तर को पढ़ें और एक अन्य पशु चिकित्सक से टिप्पणी करें । इस तरह की बातचीत से मुझे खुशी मिलती है।
  3. मुझे अंक पसंद हैं!
  4. # 3 देखें।
  5. मुझे दिलचस्प समस्याएं पसंद हैं।

मेरे सभी शुद्ध इरादे महान और सभी हैं, लेकिन मुझे संतुष्टि मिलती है अगर मैं 1 प्रश्न या 30 का उत्तर देता हूं। मेरी पसंद क्या है जिसके लिए प्रश्नों का उत्तर देने के लिए बिंदु अधिकतमकरण का एक बड़ा घटक है।

मैं दिलचस्प समस्याओं पर भी समय बिताऊंगा, लेकिन यह कुछ और दूर का है और एक ऐसे व्यक्ति की मदद नहीं करता है जिसे एक गैर-दिलचस्प प्रश्न के समाधान की आवश्यकता होती है। किसी प्रश्न का उत्तर देने के लिए मुझे प्राप्त करने के लिए आपकी सबसे अच्छी शर्त यह है कि उस प्रश्न का जवाब देने के लिए मेरे लिए एक कम से कम प्रयास के साथ उस विषय पर बात करें। अगर मैं दो प्रश्नों को देख रहा हूं और एक कोड है तो मुझे उन सभी चर बनाने के लिए पेस्ट कॉपी कर सकते हैं जिनकी मुझे आवश्यकता है ... मैं वह ले रहा हूं! यदि मेरे पास समय है, तो मैं दूसरे पर वापस आऊंगा।

मुख्य सलाह

सवालों के जवाब देने वाले लोगों के लिए इसे आसान बनाएं।

  • वह कोड प्रदान करें जो कि आवश्यक चर बनाता है।
  • उस कोड को कम से कम करें। अगर मेरी नज़र पोस्ट की तरह दिखती है, तो मैं अगले सवाल पर आता हूं या फिर जो कुछ भी कर रहा हूं, उस पर वापस लौटता हूं।
  • आप जो पूछ रहे हैं उसके बारे में सोचें और विशिष्ट बनें। हम यह देखना चाहते हैं कि आपने क्या किया है क्योंकि प्राकृतिक भाषाएँ (अंग्रेजी) अक्षम और भ्रमित हैं। एक प्राकृतिक भाषा विवरण में विसंगतियों को हल करने में आपकी सहायता करने के लिए आपने जो प्रयास किए हैं उनके कोड नमूने।
  • कृपया दिखाएं कि आप क्या उम्मीद करते हैं !!! मुझे बैठकर चीजों को आजमाना है। मैं लगभग कभी भी कुछ चीजों को आज़माए बिना किसी सवाल का जवाब नहीं जानता। यदि मुझे ऐसा कोई उदाहरण नहीं दिखता है कि आप क्या देख रहे हैं, तो मैं इस प्रश्न पर पास हो सकता हूं क्योंकि मुझे अनुमान लगाने का मन नहीं है।

आपकी प्रतिष्ठा सिर्फ आपकी प्रतिष्ठा से अधिक है।

मुझे अंक पसंद हैं (मैंने ऊपर उल्लेख किया है)। लेकिन वे बिंदु वास्तव में वास्तव में मेरी प्रतिष्ठा नहीं हैं। मेरी असली प्रतिष्ठा यह है कि साइट पर अन्य मेरे बारे में क्या सोचते हैं, का एक समामेलन है। मैं निष्पक्ष और ईमानदार होने का प्रयास करता हूं और मुझे उम्मीद है कि अन्य लोग भी इसे देख सकते हैं। पूछने वाले के लिए इसका मतलब क्या है, हम पूछने वालों के व्यवहार को याद करते हैं। यदि आप उत्तर का चयन नहीं करते हैं और अच्छे उत्तरों को बढ़ाते हैं, तो मुझे याद है। यदि आप उन तरीकों से व्यवहार करते हैं जो मुझे पसंद नहीं हैं या जिन तरीकों से मैं पसंद करता हूं, मुझे याद है। यह भी कि मैं किन सवालों के जवाब दूंगा।


वैसे भी, मैं शायद जा सकता हूं, लेकिन मैं आप सभी को छोड़ दूंगा जो वास्तव में इसे पढ़ते हैं।


26

चुनौती एसओ सवालों के जवाब देने के सबसे चुनौतीपूर्ण पहलुओं में से एक है समस्या को दोबारा बनाने में लगने वाला समय (डेटा सहित)। जिन प्रश्नों में डेटा को पुन: पेश करने का स्पष्ट तरीका नहीं है, उनके उत्तर दिए जाने की संभावना कम होती है। यह देखते हुए कि आप एक प्रश्न लिखने के लिए समय ले रहे हैं और आपके पास एक ऐसा मुद्दा है, जिसकी आप मदद करना चाहते हैं, आप आसानी से खुद को डेटा प्रदान करके मदद कर सकते हैं जो कि अन्य लोग तब आपकी समस्या को हल करने में मदद कर सकते हैं।

अच्छे पंडों के प्रश्न लिखने के लिए @Andy द्वारा दिए गए निर्देश एक उत्कृष्ट स्थान है। अधिक जानकारी के लिए, कैसे पूछें और कैसे कम से कम, पूर्ण और सत्यापन योग्य उदाहरण बनाएं ।

कृपया अपने प्रश्न को स्पष्ट रूप से बताएं। अपने प्रश्न और किसी भी नमूना कोड को लिखने के लिए समय निकालने के बाद, इसे पढ़ने की कोशिश करें और अपने पाठक के लिए एक 'कार्यकारी सारांश' प्रदान करें जो समस्या का सारांश देता है और स्पष्ट रूप से प्रश्न बताता है।

मूल प्रश्न :

मेरे पास यह डेटा है ...

मैं यह करना चाहता हूँ...

मैं चाहता हूं कि मेरा परिणाम इस तरह दिखे ...

हालाँकि, जब मैं [यह] करने की कोशिश करता हूं, तो मुझे निम्नलिखित समस्या आती है ...

मैंने [यह] और [कि] करके समाधान खोजने की कोशिश की है।

मैं इसे कैसे ठीक करूं?

प्रदान किए गए डेटा, नमूना कोड और त्रुटि ढेर की मात्रा के आधार पर, पाठक को यह समझने से पहले एक लंबा रास्ता तय करना होगा कि समस्या क्या है। अपने प्रश्न को पुनर्स्थापित करने का प्रयास करें ताकि प्रश्न स्वयं शीर्ष पर हो, और फिर आवश्यक विवरण प्रदान करें।

संशोधित प्रश्न :

दहन: मैं [यह] कैसे कर सकता हूं?

मैंने [यह] और [कि] करके समाधान खोजने की कोशिश की है।

जब मैंने [यह] करने की कोशिश की है, तो मुझे निम्नलिखित समस्या है ...

मैं अपने अंतिम परिणाम इस तरह देखना चाहता हूँ ...

यहाँ कुछ न्यूनतम कोड है जो मेरी समस्या को पुन: उत्पन्न कर सकते हैं ...

और यहाँ मेरा नमूना डेटा फिर से बनाने का तरीका है: df = pd.DataFrame({'A': [...], 'B': [...], ...})

प्रस्तावित नमूना डेटा की जरूरत है !!!

कभी-कभी DataFrame का सिर्फ सिर या पूंछ ही वह सब है जिसकी जरूरत होती है। आप बड़े डेटासेट बनाने के लिए @JohnE द्वारा प्रस्तावित विधियों का भी उपयोग कर सकते हैं जिन्हें दूसरों द्वारा पुन: प्रस्तुत किया जा सकता है। स्टॉक की कीमतों की 100 पंक्ति डेटाफ़्रेम उत्पन्न करने के लिए उनके उदाहरण का उपयोग करना:

stocks = pd.DataFrame({ 
    'ticker':np.repeat( ['aapl','goog','yhoo','msft'], 25 ),
    'date':np.tile( pd.date_range('1/1/2011', periods=25, freq='D'), 4 ),
    'price':(np.random.randn(100).cumsum() + 10) })

यदि यह आपका वास्तविक डेटा था, तो आप डेटाफ़्रेम के सिर और / या पूंछ को इस प्रकार शामिल करना चाह सकते हैं (किसी भी संवेदनशील डेटा को अज्ञात करना सुनिश्चित करें):

>>> stocks.head(5).to_dict()
{'date': {0: Timestamp('2011-01-01 00:00:00'),
  1: Timestamp('2011-01-01 00:00:00'),
  2: Timestamp('2011-01-01 00:00:00'),
  3: Timestamp('2011-01-01 00:00:00'),
  4: Timestamp('2011-01-02 00:00:00')},
 'price': {0: 10.284260107718254,
  1: 11.930300761831457,
  2: 10.93741046217319,
  3: 10.884574289565609,
  4: 11.78005850418319},
 'ticker': {0: 'aapl', 1: 'aapl', 2: 'aapl', 3: 'aapl', 4: 'aapl'}}

>>> pd.concat([stocks.head(), stocks.tail()], ignore_index=True).to_dict()
{'date': {0: Timestamp('2011-01-01 00:00:00'),
  1: Timestamp('2011-01-01 00:00:00'),
  2: Timestamp('2011-01-01 00:00:00'),
  3: Timestamp('2011-01-01 00:00:00'),
  4: Timestamp('2011-01-02 00:00:00'),
  5: Timestamp('2011-01-24 00:00:00'),
  6: Timestamp('2011-01-25 00:00:00'),
  7: Timestamp('2011-01-25 00:00:00'),
  8: Timestamp('2011-01-25 00:00:00'),
  9: Timestamp('2011-01-25 00:00:00')},
 'price': {0: 10.284260107718254,
  1: 11.930300761831457,
  2: 10.93741046217319,
  3: 10.884574289565609,
  4: 11.78005850418319,
  5: 10.017209045035006,
  6: 10.57090128181566,
  7: 11.442792747870204,
  8: 11.592953372130493,
  9: 12.864146419530938},
 'ticker': {0: 'aapl',
  1: 'aapl',
  2: 'aapl',
  3: 'aapl',
  4: 'aapl',
  5: 'msft',
  6: 'msft',
  7: 'msft',
  8: 'msft',
  9: 'msft'}}

आप डेटाफ़्रेम (केवल प्रासंगिक कॉलम का उपयोग करके) का विवरण भी प्रदान करना चाह सकते हैं। इससे प्रत्येक कॉलम के डेटा प्रकारों की जांच करना और अन्य सामान्य त्रुटियों की पहचान करना आसान हो जाता है (जैसे कि स्ट्रिंग बनाम डेटाटाइम 64 बनाम ऑब्जेक्ट):

stocks.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 0 to 99
Data columns (total 3 columns):
date      100 non-null datetime64[ns]
price     100 non-null float64
ticker    100 non-null object
dtypes: datetime64[ns](1), float64(1), object(1)

नोट: यदि आपके DataFrame में MultiIndex है:

यदि आपके DataFrame में मल्टीएंडेक्स है, तो आपको कॉल करने से पहले रीसेट करना होगा to_dict। फिर आपको सूचकांक का उपयोग करके फिर से बनाना होगा set_index:

# MultiIndex example.  First create a MultiIndex DataFrame.
df = stocks.set_index(['date', 'ticker'])
>>> df
                       price
date       ticker           
2011-01-01 aapl    10.284260
           aapl    11.930301
           aapl    10.937410
           aapl    10.884574
2011-01-02 aapl    11.780059
...

# After resetting the index and passing the DataFrame to `to_dict`, make sure to use 
# `set_index` to restore the original MultiIndex.  This DataFrame can then be restored.

d = df.reset_index().to_dict()
df_new = pd.DataFrame(d).set_index(['date', 'ticker'])
>>> df_new.head()
                       price
date       ticker           
2011-01-01 aapl    10.284260
           aapl    11.930301
           aapl    10.937410
           aapl    10.884574
2011-01-02 aapl    11.780059

12

यहां मेरा संस्करण है dput- पंडों के लिए मानक आर उपकरण प्रजनन योग्य रिपोर्ट बनाने के लिए DataFrame। यह शायद अधिक जटिल फ्रेम के लिए विफल हो जाएगा, लेकिन यह आसान मामलों में काम करने के लिए लगता है:

import pandas as pd
def dput (x):
    if isinstance(x,pd.Series):
        return "pd.Series(%s,dtype='%s',index=pd.%s)" % (list(x),x.dtype,x.index)
    if isinstance(x,pd.DataFrame):
        return "pd.DataFrame({" + ", ".join([
            "'%s': %s" % (c,dput(x[c])) for c in x.columns]) + (
                "}, index=pd.%s)" % (x.index))
    raise NotImplementedError("dput",type(x),x)

अभी,

df = pd.DataFrame({'a':[1,2,3,4,2,1,3,1]})
assert df.equals(eval(dput(df)))
du = pd.get_dummies(df.a,"foo")
assert du.equals(eval(dput(du)))
di = df
di.index = list('abcdefgh')
assert di.equals(eval(dput(di)))

ध्यान दें कि यह एक बहुत अधिक क्रिया उत्पादन की तुलना में DataFrame.to_dict, उदाहरण के लिए,

pd.DataFrame({
  'foo_1':pd.Series([1, 0, 0, 0, 0, 1, 0, 1],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1)),
  'foo_2':pd.Series([0, 1, 0, 0, 1, 0, 0, 0],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1)),
  'foo_3':pd.Series([0, 0, 1, 0, 0, 0, 1, 0],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1)),
  'foo_4':pd.Series([0, 0, 0, 1, 0, 0, 0, 0],dtype='uint8',index=pd.RangeIndex(start=0, stop=8, step=1))},
  index=pd.RangeIndex(start=0, stop=8, step=1))

बनाम

{'foo_1': {0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1, 6: 0, 7: 1}, 
 'foo_2': {0: 0, 1: 1, 2: 0, 3: 0, 4: 1, 5: 0, 6: 0, 7: 0}, 
 'foo_3': {0: 0, 1: 0, 2: 1, 3: 0, 4: 0, 5: 0, 6: 1, 7: 0}, 
 'foo_4': {0: 0, 1: 0, 2: 0, 3: 1, 4: 0, 5: 0, 6: 0, 7: 0}}

के लिए duऊपर है, लेकिन यह स्तंभ प्रकार को बरकरार रखता है । जैसे, उपरोक्त परीक्षण मामले में,

du.equals(pd.DataFrame(du.to_dict()))
==> False

क्योंकि du.dtypesहै uint8और pd.DataFrame(du.to_dict()).dtypesहै int64


यह स्पष्ट है, हालांकि मैं मानता हूं कि मैं यह नहीं देखता कि मैं इसका इस्तेमाल क्यों करना चाहता हूंto_dict
पॉल एच

2
क्योंकि यह स्तंभ प्रकारों को संरक्षित करता है। विशेष रूप से, du.equals(eval(dput(df)))
एसडीएस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.