İyi tekrarlanabilir panda örnekleri nasıl yapılır


221

Her ikisi de izlerken iyi bir süre geçirdim ve SO etiketleri, aldığım izlenim, pandassoruların tekrarlanabilir veri içermesi olasılığının düşük olmasıdı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 tekrarlanabilir verilerle geri dönebilen kişiler, sorularına cevap almakta genellikle daha iyi şanslara sahip olacaktır.

pandasSorular için iyi tekrarlanabilir örnekler 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 işlevine eşdeğer mi?)
  • MultiIndex veya Panel verileri

Birkaç satır kod kullanarak taklit edilmesi zor olan veri kümeleri için, veri dput()yapınızı yeniden oluşturmak üzere kopyalanabilir kodlar oluşturmanıza olanak tanıyan R'lere eşdeğer mi?


8
Yazdırma çıktısını kopyalarsanız, yanıtlayanlar çoğu zaman MultiIndex: s dışında read_clipboard () ... öğesini kullanabilir. Bunu söyleyerek, diksiyon iyi bir ek
Andy Hayden

8
Andy'nin söylediklerine ek olarak, sanırım kopya yapıştırma df.head(N).to_dict(), Nbazı makul sayıların gitmek için iyi bir yol. Çıktıya güzel satır sonları eklemek için Bonus + 1'ler. Zaman damgaları için, genellikle from pandas import Timestampkodun üst kısmına eklemeniz gerekir .
Paul H

Yanıtlar:


323

Not: Buradaki fikirler Stack Overflow, aslında sorular için oldukça geneldir .

Feragatname: İyi bir soru yazmak ZORDUR.

İyi:

  • çalıştırılabilir kod olarak küçük * örnek DataFrame ekleyin:

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

    veya kullanarak "kopyala ve yapıştırılabilir" yapın pd.read_clipboard(sep='\s\s+'), Yığın Taşması vurgulaması için metni biçimlendirebilir ve Ctrl+ kullanabilirsiniz K(veya her satıra dört boşluk ekleyebilirsiniz) veya kodunuz girilmemiş olarak kodunuzun üzerine 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 , örnek DataFrames büyük çoğunluğu 6 satır alıntı gerekli daha az olabilir ve ben 5 satırda bunu yapabilirim bahse girerim. df = df.head()Karşılaştığınız sorunu gösteren küçük bir DataFrame yapıp yapamayacağınızı görmek için etrafta dolaşmazsanız , hatayı yeniden üretebilir misiniz?

    * Her kuralın bir istisnası vardır, bariz olanı, üretmeniz gereken performans sorunları ( bu durumda kesinlikle% timeit ve muhtemelen% prun kullanın ) içindir (np.random.seed kullanmayı düşünün, böylece aynı çerçeveye sahibiz) df = pd.DataFrame(np.random.randn(100000000, 10)). "Bu kodu benim için hızlı yap" demek kesinlikle sitenin konusuyla ilgili değildir ...

  • arzu ettiğ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 dizinde bulunur.

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

    Toplam için doktrin basitçe "Grup değerlerinin toplamını hesapla"

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

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

  • Zaman damgası sütunlarınız varsa, örneğin yeniden örnekleme veya başka bir şey yapıyorsanız, açık olun ve pd.to_datetimeiyi önlem almak için bu sütunlara uygulayın **.

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

    ** Bazen sorunun kendisi budur: iplerdi.

Kötü:

  • kopyalayıp yapıştıramayacağımız bir MultiIndex eklemeyin (yukarıya bakın), bu pandaların varsayılan ekranı ile ilgili bir sıkıntıdır, ancak yine de sinir bozucu:

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

    Doğru yol, bir set_indexçağrı içeren 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ğuna dair fikir verin:

       B
    A   
    1  1
    5  0
    

    Sayıları nasıl aldığınız konusunda net olun (bunlar nedir) ... doğru olup olmadıklarını bir kez daha kontrol edin.

  • Kodunuz bir hata atarsa, tüm yığın izlemesini dahil edin (çok gürültülü ise daha sonra düzenlenebilir). Satır numarasını (ve kodunuzun karşı çıktığı karşılık gelen satırı) gösterin.

Çirkin:

  • erişemediğimiz bir csv'ye bağlanma (ideal olarak harici bir kaynağa hiç bağlanma ...)

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

    Çoğu verinin tescilli olduğunu görüyoruz: 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, durumdaki sözcükleri belirsiz bir şekilde açıklamayın, geçerken bazı sütun adlarından bahsedin (türlerini belirtmediğinizden emin olun). Gerçek bağlamı görmeden tamamen anlamsız bir şey hakkında çok fazla ayrıntıya girmeye çalışın. Muhtemelen hiç kimse bu paragrafın sonuna kadar okumaz.

    Denemeler kötü, küçük örneklerle daha kolay.

  • Asıl sorunuza ulaşmadan önce 10'dan fazla (100+ ??) satır veri yazmayın.

    Lütfen, bunu günlük işlerimizde 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 DataFrames'i (veya bunların küçük sürümlerini) gösterin.

Her neyse, eğlenceli Python, NumPy ve Pandalar öğrenme eğlenin!


30
pd.read_clipboard(sep='\s\s+')Bahşiş için +1 . Özel ancak kolayca paylaşılabilen bir veri çerçevesine ihtiyaç duyan SO soruları gönderdiğimde, bunu excel'de oluşturdum, panoya kopyaladım, ardından SOers'a aynı şeyi yapmasını söyleyin. Çok zaman kazandırır!
zelusp

1
pd.read_clipboard(sep='\s\s+')Eğer büyük veri kümeleri bir çok yaşadığımız bir uzak sunucuda, üzerinde Python kullanıyorsanız öneri çalışması görünmüyor.
user5359531

1
Neden pd.read_clipboard(sep='\s\s+')daha basit değil pd.read_clipboard()(varsayılan ile ‘s+’)? Sadece 1 varsa sorunlara neden olabilir ilk ihtiyaç, en az 2 boşluk karakterleri, (örneğin @JohnE 'ın böyle bakın cevap ).
MarianD

3
\ S \ s + 'ın bu kadar popüler olmasının nedeni genellikle bir sütun adında bir tane olması, ancak birden çok daha nadir olmasıdır ve panda çıktıları sütunlar arasında en az iki tane yerleştirir. Bu sadece oyuncak / küçük veri setleri için olduğu için oldukça güçlü / vakaların çoğu. Not: ayrılmış sekmeler farklı bir hikaye olur, ancak stackoverflow sekmeleri boşluklarla değiştirir, ancak bir tsv'niz varsa \ t kullanın.
Andy Hayden

3
Ugh, ben her zaman kullanın pd.read_clipboard(), onların boşluk olduğunda, ben pd.read_clipboard(sep='\s+{2,}', engine='python'): - P
U10-Forward

72

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

Bu esas olarak örnek veri çerçeveleri nasıl oluşturabileceğinize dair örnekler vererek @ AndyHayden'in cevabını genişletmektir. Pandalar ve (özellikle) numpy size bunun için çeşitli araçlar sağlar, böylece herhangi bir gerçek veri kümesinin makul bir faksını yalnızca birkaç satır kodla oluşturabilirsiniz.

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

import numpy as np
import pandas as pd

np.random.seed(123)

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çeveleri 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 şunu ü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 grup ve indeks oluşturmak için çok kullanışlıdır. 2 sütun için bu, r'leri kolayca çoğaltmak için kullanılabilir, expand.grid()ancak aynı zamanda tüm permütasyonların bir alt kümesini sağlama konusunda daha esnektir. Ancak, 3 veya daha fazla sütun için sözdizimi hızla kullanılmaz 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 biraz yapabilirsiniz np.random.choice. Örneğin, sütunda g, 2011'den itibaren 6 tarih arasında rastgele bir seçim var. Ayrıca, replace=Falsebu tarihlerin benzersiz olduğundan emin olabiliriz - 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, teknikleri hemen hemen her şeyi yapmak için birleştirebilirsiniz. Örneğin , aynı tarihleri ​​kapsayan 4 hisse senedi için birleştirme np.tileve date_rangeörnek senedi verileri oluşturmak için 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ı bir örnek veri kümemiz var (kayan yazı başına 25 tarih), ancak bunu yapmak için sadece 4 satır kullandık, bu da herkesin 100 satır kod kopyalayıp yapıştırmadan çoğaltmasını kolaylaştırdı. Ardından, sorunuzun açıklanmasına yardımcı olursa 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

2
Mükemmel cevap. Bu soruyu yazdıktan sonra expand.grid(), panda yemek kitabına dahil edilen çok kısa ve basit bir uygulama yazdım , bunu cevabınıza da dahil edebilirsiniz. Cevabınız, expand_grid()işlevimin işleyebileceğinden daha karmaşık veri kümelerinin nasıl oluşturulacağını gösterir , bu harika.
Marius

46

Yanıtlayanın Günlüğü

Soru sormak için en iyi tavsiyem, soruları cevaplayan kişilerin psikolojisi üzerinde oynamak olacaktır. Bu insanlardan biri olarak, neden bazı soruları cevapladığımı ve neden başkalarını cevaplamadığımı anlatabilirim.

Motivasyonları

Birkaç nedenden dolayı soruları cevaplamak için motive oldum

  1. Stackoverflow.com benim için çok değerli bir kaynak oldu. Geri vermek istedim.
  2. Geri verme çabalarımda, bu sitenin eskisinden çok daha güçlü bir kaynak olduğunu gördüm. Soruları cevaplamak benim için bir öğrenme deneyimidir ve öğrenmek isterim. Bu cevabı okuyun ve başka bir veterinerden yorum yapın . Bu tür bir etkileşim beni mutlu ediyor.
  3. Puanları severim!
  4. Bkz.
  5. İlginç sorunları severim.

En saf niyetlerim harika ve hepsi, ama 1 veya 30 soruyu cevaplarsam bu memnuniyeti elde ederim. Hangi soruları cevaplamak için seçimlerimi yönlendiren şey , nokta maksimizasyonunun büyük bir bileşenine sahiptir.

İlginç sorunlara da zaman harcayacağım ama bu çok az ve çok uzak ve ilginç olmayan bir soruya çözüm arayan bir askere yardım etmiyor. Bir soruyu yanıtlamam için en iyi seçim, bu soruyu olabildiğince az çabayla cevaplamam için olgunlaşmış bir tepside sunmaktır. Eğer iki soruya bakıyorum ve bir kod varsa ben ihtiyacım olan tüm değişkenleri oluşturmak için Yapıştır kopyalayabilirsiniz ... Bunu alıyorum! Belki zamanım olursa diğerine geri dönerim.

Ana Tavsiye

Soruları yanıtlayan kişilerin işini kolaylaştırın.

  • Gerekli değişkenleri oluşturan kodu sağlayın.
  • Kodu en aza indirin. Eğer göreve baktığımda gözlerim parlıyorsa, bir sonraki soruya geçiyorum ya da yaptığım başka şeye geri dönüyorum.
  • Ne istediğini düşün ve spesifik ol. Ne yaptığınızı görmek istiyoruz, çünkü doğal diller (İngilizce) tam ve kafa karıştırıcıdır. Denediğinizin örneklerini kodlayın, doğal dil açıklamasındaki tutarsızlıkları gidermeye yardımcı olur.
  • LÜTFEN beklediğinizi göster !!! Oturup bir şeyler denemeliyim. Bazı şeyleri denemeden bir sorunun cevabını neredeyse hiç bilmiyorum. Aradığın şeyin bir örneğini görmezsem soruyu aktarabilirim çünkü tahmin etmek istemiyorum.

Ününüz sadece ününüzden daha fazlasıdır.

Puanları severim (yukarıda bahsetmiştim). Ama bu noktalar gerçekten benim itibarım değil. Gerçek itibarım, sitedeki başkalarının benim hakkımda ne düşündüğünün birleşmesidir. Adil ve dürüst olmaya gayret ediyorum ve umarım diğerleri bunu görebilir. Bunun bir asker için anlamı, soranların davranışlarını hatırlıyoruz. Cevapları seçmezseniz ve iyi cevapları oylarsanız, hatırlıyorum. Eğer sevmediğim şekilde ya da sevdiğim şekilde davranırsan hatırlıyorum. Bu aynı zamanda hangi soruları cevaplayacağım.


Her neyse, muhtemelen devam edebilirim, ama bunu gerçekten okuyan hepinizi koruyacağım.


26

Zorluk SO sorularına cevap vermenin en zor yanlarından biri, problemi yeniden oluşturmak için gereken süredir (veriler dahil). Verileri yeniden üretmek için net bir yolu olmayan soruların cevaplanması daha az olasıdır. Bir soru yazmak için zaman ayırdığınızdan ve yardım etmek istediğiniz bir sorununuz olduğunda, başkalarının sorununuzu çözmek için kullanabileceği verileri sağlayarak kendinize kolayca yardımcı olabilirsiniz.

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

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

Orijinal soru :

Bu verilerim var ...

Bunu yapmak istiyorum...

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

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

[This] ve [that] yaparak çözüm bulmaya çalıştım.

Nasıl düzeltebilirim?

Verilerin miktarına, örnek koduna ve hata yığınlarına bağlı olarak, okuyucunun sorunun ne olduğunu anlamadan önce uzun bir yol kat etmesi gerekir. Sorunun üst kısmında yer alması için sorunuzu yeniden düzenlemeyi deneyin ve ardından gerekli ayrıntıları sağlayın.

Gözden Geçirilmiş Soru :

Soru: [Bunu] nasıl yapabilirim?

[This] ve [that] yaparak çözüm bulmaya çalıştım.

[Bunu] yapmaya çalıştığımda, aşağıdaki sorunu alıyorum ...

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

İşte benim sorunum yeniden üretebilir bazı minimal kod ...

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

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

Bazen sadece DataFrame'in başı veya kuyruğu yeterlidir. Başkaları tarafından çoğaltılabilecek daha büyük veri kümeleri oluşturmak için @JohnE tarafından önerilen yöntemleri de kullanabilirsiniz. 100 satırlık bir DataFrame hisse senedi fiyatı oluşturmak için örneğini kullanma:

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

Gerçek verileriniz buysa, veri çerçevesinin başını ve / veya kuyruğunu aşağıdaki gibi dahil etmek 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 vermek 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ı tanımlamasını kolaylaştırır (ör. Tarihler dize ile datetime64'e karşı 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 bir MultiIndex varsa:

DataFrame'inizde çoklu dizin varsa, aramadan önce sıfırlamanız gerekir to_dict. Daha sonra dizini aşağıdakileri kullanarak 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

12

İşte dputPandadas DataFrames için benim yeniden üretilebilir raporlar üretmek için standart R aracı sürümü . Muhtemelen daha karmaşık çerçeveler için başarısız olacaktır, 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.dtypesöyle uint8ve pd.DataFrame(du.to_dict()).dtypesöyle int64.


daha açık olsa da, neden kullanmak istediğimi anlamıyorum itiraf ediyorumto_dict
Paul H

2
Çünkü sütun tiplerini korur. Daha spesifik olarak du.equals(eval(dput(df))),.
sds
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.