Wyzwanie Jednym z najtrudniejszych aspektów odpowiedzi na pytania SO jest czas potrzebny do odtworzenia problemu (w tym danych). Odpowiedzi na pytania, które nie mają jasnego sposobu na odtworzenie danych, są mniej prawdopodobne. Biorąc pod uwagę, że poświęcasz czas na napisanie pytania i masz problem, z którym chciałbyś pomóc, możesz łatwo pomóc sobie, dostarczając dane, które inni mogą następnie wykorzystać, aby rozwiązać problem.
Instrukcje dostarczone przez @Andy dotyczące pisania dobrych pytań dotyczących pand są doskonałym miejscem na rozpoczęcie. Aby uzyskać więcej informacji, zapoznaj się z pytaniem i jak tworzyć przykłady minimalne, kompletne i weryfikowalne .
Proszę jasno podać swoje pytanie z góry. Po poświęceniu czasu na napisanie pytania i kodu przykładowego postaraj się je przeczytać i dostarczyć czytelnikowi „Streszczenie”, które podsumowuje problem i jasno określa pytanie.
Oryginalne pytanie :
Mam te dane ...
Chce to zrobić...
Chcę, aby mój wynik wyglądał tak ...
Jednak gdy próbuję to zrobić, pojawia się następujący problem ...
Próbowałem znaleźć rozwiązania, robiąc [to] i [tamto].
Jak to naprawić?
W zależności od ilości danych, przykładowego kodu i stosów błędów, czytnik musi przejść długą drogę, zanim zrozumie, na czym polega problem. Spróbuj ponownie sformułować pytanie, aby samo pytanie było na górze, a następnie podaj niezbędne szczegóły.
Zmienione pytanie :
Pytanie: Jak mogę to zrobić?
Próbowałem znaleźć rozwiązania, robiąc [to] i [tamto].
Gdy próbuję to zrobić, pojawia się następujący problem ...
Chciałbym, aby moje wyniki końcowe wyglądały tak ...
Oto minimalny kod, który może odtworzyć mój problem ...
A oto jak odtworzyć moje przykładowe dane:
df = pd.DataFrame({'A': [...], 'B': [...], ...})
PODAJ PRZYKŁADOWE DANE, JEŚLI POTRZEBUJESZ !!!
Czasami wystarczy tylko głowa lub ogon DataFrame. Możesz także użyć metod zaproponowanych przez @JohnE, aby utworzyć większe zbiory danych, które mogą być powielane przez innych. Korzystając z tego przykładu, wygenerował 100-ramkowy DataFrame cen akcji:
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) })
Jeśli były to twoje rzeczywiste dane, możesz po prostu zamieścić nagłówek i / lub ogon ramki danych w następujący sposób (pamiętaj o anonimizacji poufnych danych):
>>> 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'}}
Możesz także podać opis DataFrame (używając tylko odpowiednich kolumn). Ułatwia to innym sprawdzanie typów danych w każdej kolumnie i identyfikowanie innych typowych błędów (np. Daty jako ciąg vs. datetime64 vs. obiekt):
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)
UWAGA: Jeśli twoja ramka danych ma MultiIndex:
Jeśli twoja DataFrame ma multiindeks, musisz najpierw zresetować przed wywołaniem to_dict
. Następnie musisz ponownie utworzyć indeks, używając 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