İyi çoğaltılabilir panda örnekleri nasıl yapılır

Nov 21 2013

Her iki izlerken zaman insana yakışır bir miktar geçirmiş olması r ve pandalar SO etiketleri, ben almak izlenim olduğunu pandassoruların daha az olasılıkla tekrarlanabilir veriler içermesi vardır. Bu R topluluğu teşvik konusunda oldukça iyi olmuştur şeydir ve benzeri kılavuzları sayesinde bu yeni gelenler birlikte bu örnekleri koyarak biraz yardım almak edebiliyoruz. Bu kılavuzları okuyabilen ve yeniden üretilebilir verilerle geri gelen kişiler, sorularına yanıtlar almak için genellikle çok daha fazla şansa sahip olacaklardır.

pandasSorular için tekrarlanabilir iyi örnekleri nasıl oluşturabiliriz ? Basit veri çerçeveleri bir araya getirilebilir, örneğin:

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

Ancak birçok örnek veri kümesinin daha karmaşık bir yapıya ihtiyacı vardır, örneğin:

  • datetime endeksler veya veriler
  • Çoklu kategorik değişkenler ( expand.grid()verilen bazı değişkenlerin tüm olası kombinasyonlarını üreten R'nin fonksiyonuna bir eşdeğer var mı?)
  • MultiIndex veya Panel verileri

Birkaç satır kod kullanarak dput()modellemesi zor olan veri kümeleri için, veri yapınızı yeniden oluşturmak için kopyalanabilir kod oluşturmanıza olanak tanıyan R'lere bir eşdeğeri var mı?

Yanıtlar

362 AndyHayden Nov 23 2013 at 13:19

Not: Buradaki fikirler Stack Overflow için oldukça geneldir, gerçekten de sorular .

Sorumluluk Reddi: İyi bir soru yazmak ZORdur.

İyi:

  • küçük * örnek DataFrame'i çalıştırılabilir kod olarak dahil edin:

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

    veya kullanarak "kopyalayıp yapıştırılabilir" yapın pd.read_clipboard(sep='\s\s+'), Yığın Taşması vurgulama için metni biçimlendirebilir ve Ctrl+ kullanabilir K(veya her satırın başına dört boşluk ekleyebilir) veya kodunuz girintisiz olarak kodunuzun üstüne ve altına üç tild yerleştirebilirsiniz:

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

    pd.read_clipboard(sep='\s\s+')kendinizi test edin .

    * Gerçekten küçük demek istiyorum , DataFrames örneğinin büyük çoğunluğu 6 satırdan daha az alıntı gerektirebilir ve bahse girerim bunu 5 satırda yapabilirim. Birlikte hatayı yeniden Can df = df.head()görmemek keman etrafında eğer karşılaştığınız sorunu sergileyen küçük DataFrame makyaj eğer.

    * Her kuralın bir istisnası vardır, bariz bir (performans sorunları için bu durumda kesinlikle% sürümüyle gelen timeit ve muhtemelen% prun kullanmak (biz tam aynı çerçeveniz olması açısından np.random.seed kullanarak düşünün), elde etmelidir): df = pd.DataFrame(np.random.randn(100000000, 10)). "Bu kodu benim için hızlı yap" demek sitenin konusu değil ...

  • istediğiniz sonucu yazın (yukarıdakine benzer şekilde)

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

    Sayıların nereden geldiğini açıklayın: 5, A'nın 1 olduğu satırlar için B sütununun toplamıdır.

  • denediğiniz kodu gösterin :

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

    Ancak neyin yanlış olduğunu söyleyin: A sütunu bir sütun yerine dizindedir.

  • Yaptığın biraz araştırma (gösterirler dokümanları aramak , StackOverflow arama ), bir özet vermek:

    Toplam için docstring basitçe "Grup değerlerinin toplamını hesapla" ifadesini belirtir

    GroupBy dokümanlar Bunun için herhangi bir örnek vermeyin.

    Kenara: buradaki cevap kullanmaktır df.groupby('A', as_index=False).sum().

  • Zaman Damgası sütunlarınızın olması alakalıysa, örneğin yeniden örnekleme yapıyorsanız veya başka bir şey varsa, o zaman açık olun ve pd.to_datetimeiyi bir ölçüm için bunlara başvurun **.

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

    ** Bazen sorunun kendisi budur: onlar dizelerdi.

Kötü:

  • kopyalayıp yapıştıramayacağımız bir MultiIndex eklemeyin (yukarıya bakın), bu pandaların varsayılan ekranıyla ilgili bir tür şikayettir, ancak yine de can sıkıcıdır:

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

    Doğru yol, bir set_indexçağrıya sıradan bir DataFrame eklemektir :

    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
    
  • İstediğiniz sonucu verirken ne olduğu konusunda fikir verin:

       B
    A   
    1  1
    5  0
    

    Rakamları nasıl aldığınız konusunda net olun (bunlar nedir) ... doğru olup olmadıklarını iki kez kontrol edin.

  • Kodunuz bir hata verirse, tüm yığın izlemesini ekleyin (bu, çok gürültülü ise daha sonra düzenlenebilir). Satır numarasını (ve karşısına çıkan kodunuzun karşılık gelen satırını) gösterin.

Çirkin:

  • erişimimiz olmayan bir csv'ye bağlantı verme (ideal olarak harici bir kaynağa hiç bağlantı vermeyin ...)

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

    Verilerin çoğu tescillidir : Benzer verileri oluşturun ve sorunu yeniden üretip üretemeyeceğinizi görün (küçük bir şey).

  • "büyük" bir DataFrame'iniz olduğu gibi durumu belirsiz bir şekilde açıklamayın, geçerken sütun adlarından bazılarından bahsedin (dtypes'lerinden bahsetmeyin). Gerçek bağlamı görmeden tamamen anlamsız olan bir şey hakkında birçok ayrıntıya girmeye çalışın. Muhtemelen kimse bu paragrafın sonuna kadar okumayacak.

    Yazılar kötüdür, küçük örneklerle daha kolaydır.

  • asıl sorunuza gelmeden önce 10+ (100+ ??) satır veri toplama eklemeyin.

    Lütfen günlük işlerimizde bunu yeterince görüyoruz. Biz ancak, yardım isteyen değil böyle ... .
    Giriş bölümünü kesin ve size sorun yaratan adımda ilgili DataFrame'leri (veya küçük sürümlerini) gösterin.

Her neyse, Python, NumPy ve Pandas'ı öğrenirken eğlenin!

77 JohnE May 24 2015 at 21:22

Örnek veri kümeleri nasıl oluşturulur

Bu, esas olarak örnek veri çerçevelerini nasıl oluşturabileceğinize dair örnekler sunarak @ AndyHayden'ın cevabını genişletmektir. Pandalar ve (özellikle) numpy, size bunun için çeşitli araçlar sunar, öyle ki, genellikle sadece birkaç satır kodla herhangi bir gerçek veri kümesinin makul bir kopyasını oluşturabilirsiniz.

Numpy ve pandaları içe aktardıktan sonra, insanların verilerinizi ve sonuçlarınızı tam olarak yeniden üretebilmesini istiyorsanız rastgele bir tohum sağladığınızdan emin olun.

import numpy as np
import pandas as pd

np.random.seed(123)

Bir mutfak lavabosu örneği

İşte yapabileceğiniz çeşitli şeyleri gösteren bir örnek. Bunun bir alt kümesinden her türlü yararlı örnek veri çerçevesi oluşturulabilir:

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) 
    })

Bu şunları üretir:

          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

Bazı notlar:

  1. np.repeatve np.tile(sütunlar dve e) çok düzenli bir şekilde gruplar ve indeksler oluşturmak için çok kullanışlıdır. 2 sütun için bu, r'leri kolayca kopyalamak için kullanılabilir, expand.grid()ancak aynı zamanda tüm permütasyonların bir alt kümesini sağlama yeteneği açısından daha esnektir. Ancak, 3 veya daha fazla sütun için sözdizimi hızlı bir şekilde kullanışsız hale gelir.
  2. R yıllardan için daha doğrudan değiştirilmesi için expand.grid()bkz itertoolsçözüm pandalar yemek kitabı veya np.meshgridsolüsyon gösterilen burada . Bunlar herhangi bir sayıda boyuta izin verecektir.
  3. İle epey bir şey yapabilirsiniz np.random.choice. Örneğin, sütunda g, 2011'den itibaren rastgele 6 tarih seçimimiz var. Ek olarak, replace=Falsebu tarihlerin benzersiz olduğundan emin olabiliriz - eğer bunu benzersiz değerlere sahip bir dizin olarak kullanmak istiyorsak çok kullanışlıdır.

Sahte borsa verileri

Yukarıdaki kodun alt kümelerini almaya ek olarak, hemen hemen her şeyi yapmak için teknikleri daha da birleştirebilirsiniz. Örneğin , aynı tarihleri ​​kapsayan 4 hisse senedi için örnek ticker verilerini birleştiren np.tileve date_rangeoluşturan kısa bir örnek :

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) })

Şimdi 100 satırlık örnek bir veri kümemiz var (her ticker başına 25 tarih), ancak bunu yapmak için yalnızca 4 satır kullandık, bu da 100 satır kod kopyalayıp yapıştırmadan herkesin yeniden üretmesini kolaylaştırıyor. Sorunuzu açıklamaya yardımcı oluyorsa, verilerin alt kümelerini görüntüleyebilirsiniz:

>>> 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
51 piRSquared Jul 20 2016 at 01:35

Bir Yanıtlayanın Günlüğü

Soru sormak için en iyi tavsiyem, soruları cevaplayan insanların psikolojisi üzerinde oynamak olacaktır. Bu insanlardan biri olarak, neden bazı sorulara cevap verdiğime ve neden başkalarına cevap vermediğime dair fikir verebilirim.

Motivasyonlar

Birkaç nedenden dolayı soruları cevaplamaya motive oluyorum

  1. Stackoverflow.com benim için son derece değerli bir kaynak oldu. Geri vermek istedim.
  2. Geri verme çabalarımda, bu siteyi eskisinden çok daha güçlü bir kaynak olarak buldum. Soruları cevaplamak benim için bir öğrenme deneyimidir ve öğrenmeyi seviyorum. Bu cevabı ve başka bir veterinerden gelen yorumu okuyun . Bu tür bir etkileşim beni mutlu ediyor.
  3. Puanları severim!
  4. 3 numaralı maddeye bakın.
  5. İlginç sorunları severim.

Tüm en saf niyetlerim harika ve hepsi ama 1 veya 30 soruyu yanıtlarsam bu memnuniyeti elde ederim. Seçimlerimi hangi soruların cevaplanacağına yönlendiren şey, büyük bir nokta maksimizasyonu bileşenine sahiptir.

Ayrıca ilginç problemler için de zaman harcayacağım, ancak bu çok az ve çok uzak ve ilginç olmayan bir soru için çözüme ihtiyaç duyan bir soruyu sormaya yardımcı olmuyor. Bir soruyu yanıtlamamı sağlamak için en iyi seçeneğiniz, bu soruyu olabildiğince az çabayla yanıtlayabilmem için olgunlaşmış bir tabakta sunmaktır. İki soruya bakıyorsam ve birinin kodu varsa, ihtiyacım olan tüm değişkenleri oluşturmak için kopyalayıp yapıştırabilirim ... Bunu alıyorum! Vaktim olursa diğerine geri döneceğim belki.

Ana Tavsiye

İnsanların soruları cevaplamasını kolaylaştırın.

  • Gerekli değişkenleri oluşturan kod sağlayın.
  • Bu kodu küçültün. Gönderiye bakarken gözlerim kayıyorsa, bir sonraki soruya geçiyorum ya da yaptığım her şeye geri dönüyorum.
  • Ne istediğinizi düşünün ve spesifik olun. Doğal diller (İngilizce) kesin ve kafa karıştırıcı olduğu için ne yaptığınızı görmek istiyoruz. Doğal dil tanımındaki tutarsızlıkları çözmeye yardımcı olmak için denediklerinizin kod örnekleri.
  • LÜTFEN ne beklediğinizi gösterin !!! Oturmalı ve bir şeyler denemeliyim. Bazı şeyleri denemeden bir sorunun cevabını neredeyse hiç bilemiyorum. Ne aradığına dair bir örnek görmezsem, soruyu iletebilirim çünkü tahmin etmek istemiyorum.

İtibarınız, itibarınızdan daha fazlasıdır.

Noktaları severim (yukarıda bahsetmiştim). Ancak bu noktalar gerçekten benim itibarım değil. Benim gerçek itibarım, sitedeki diğerlerinin benim hakkımda ne düşündüğünün bir karışımıdır. Adil ve dürüst olmaya çalışıyorum ve umarım başkaları da görebilir. Bunun bir asker için anlamı, soranların davranışlarını hatırlıyoruz. Cevapları seçmez ve iyi cevaplara oy vermezseniz, hatırlıyorum. Hoşlanmadığım veya benim sevdiğim şekillerde davranırsan, hatırlıyorum. Bu aynı zamanda cevaplayacağım sorulara da giriyor.


Her neyse, muhtemelen devam edebilirim, ama bunu gerçekten okuyan herkesi bağışlayacağım.

31 Alexander Sep 12 2015 at 14:06

Zorluk SO sorularına yanıt vermenin en zorlu yönlerinden biri, problemi yeniden yaratmak için geçen süredir (veriler dahil). Verileri yeniden üretmenin net bir yolu olmayan soruların yanıtlanma olasılığı daha düşüktür. Bir soru yazmaya zaman ayırdığın ve yardım almak isteyeceğin bir sorunun olduğu göz önüne alındığında, daha sonra başkalarının probleminizi çözmek için kullanabileceği verileri sağlayarak kendinize kolayca yardımcı olabilirsiniz.

@Andy tarafından iyi Pandalar soruları yazmak için sağlanan talimatlar, başlamak için mükemmel bir yerdir. Daha fazla bilgi için, nasıl sorulacağına ve Minimal, Tam ve Doğrulanabilir örneklerin nasıl oluşturulacağına bakın .

Lütfen sorunuzu önceden açıkça belirtin. Sorunuzu ve herhangi bir örnek kodu yazmak için zaman ayırdıktan sonra, onu okumaya çalışın ve okuyucunuz için sorunu özetleyen ve soruyu açıkça belirten bir 'Yönetici Özeti' sağlayın.

Orijinal soru :

Bu verilere sahibim ...

Bunu yapmak istiyorum...

Sonucumun böyle görünmesini istiyorum ...

Ancak, [bunu] yapmaya çalıştığımda şu sorunu alıyorum ...

[Bunu] ve [şunu] yaparak çözüm bulmaya çalıştım.

Nasıl düzeltirim?

Verilerin miktarına, örnek koda ve sağlanan hata yığınlarına bağlı olarak, okuyucunun sorunun ne olduğunu anlamadan önce uzun bir yol kat etmesi gerekir. Sorunuzu, sorunun kendisi üstte olacak şekilde yeniden ifade etmeyi deneyin ve ardından gerekli ayrıntıları sağlayın.

Gözden Geçirilmiş Soru :

Soru: [Bunu] nasıl yapabilirim?

[Bunu] ve [şunu] yaparak çözüm bulmaya çalıştım.

[Bunu] yapmaya çalıştığımda şu sorunu alıyorum ...

Nihai sonuçlarımın böyle görünmesini istiyorum ...

İşte sorunumu yeniden üretebilecek bazı minimum kodlar ...

Ve işte örnek verilerimi nasıl yeniden oluşturacağım: df = pd.DataFrame({'A': [...], 'B': [...], ...})

GEREKİRSE ÖRNEK VERİ SAĞLAYIN !!!

Bazen gereken tek şey DataFrame'in sadece başı veya kuyruğudur. Başkaları tarafından çoğaltılabilen daha büyük veri kümeleri oluşturmak için @JohnE tarafından önerilen yöntemleri de kullanabilirsiniz. Hisse fiyatlarının 100 satırlık bir Veri Çerçevesi oluşturmak için örneğini kullanarak:

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) })

Bu sizin gerçek verilerinizse, veri çerçevesinin başını ve / veya kuyruğunu aşağıdaki gibi eklemek isteyebilirsiniz (hassas verileri anonimleştirdiğinizden emin olun):

>>> 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'}}

Ayrıca, DataFrame'in bir açıklamasını da sağlamak isteyebilirsiniz (yalnızca ilgili sütunları kullanarak). Bu, başkalarının her bir sütunun veri türlerini kontrol etmesini ve diğer yaygın hataları belirlemesini kolaylaştırır (ör. Tarihler, dize, tarih saat64 ve nesne):

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)

NOT: DataFrame'inizde MultiIndex varsa:

DataFrame'inizde çoklu dizin varsa, aramadan önce sıfırlamanız gerekir to_dict. Daha sonra aşağıdakileri kullanarak dizini yeniden oluşturmanız gerekir 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
15 sds Dec 17 2016 at 00:57

İşte dputPandalar için tekrarlanabilir raporlar üretmek için standart R aracı olan versiyonum DataFrame. Muhtemelen daha karmaşık çerçevelerde başarısız olacak, ancak işi basit durumlarda yapıyor gibi görünüyor:

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)

şimdi

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)))

Not bu çok daha ayrıntılı çıktı ürettiğini DataFrame.to_dictörneğin,

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))

vs

{'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}}

için dutanımlandıkları gibidir, ama bu sütun türlerini korur . Örneğin, yukarıdaki test durumunda,

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

Çünkü du.dtypesolduğunu uint8ve pd.DataFrame(du.to_dict()).dtypesbir int64.