O desafio Um dos aspectos mais desafiadores da resposta a perguntas de SO é o tempo necessário para recriar o problema (incluindo os dados). Perguntas que não têm uma maneira clara de reproduzir os dados têm menos probabilidade de serem respondidas. Como você está escrevendo um tempo para escrever uma pergunta e tem um problema com o qual gostaria de ajudar, você pode se ajudar facilmente, fornecendo dados que outras pessoas podem usar para ajudar a resolver seu problema.
As instruções fornecidas pelo @Andy para escrever boas perguntas sobre os pandas são um excelente ponto de partida. Para obter mais informações, consulte como perguntar e como criar exemplos mínimos, completos e verificáveis .
Indique claramente sua pergunta com antecedência. Após reservar um tempo para escrever sua pergunta e qualquer código de amostra, tente lê-la e forneça um 'Resumo executivo' para o seu leitor que resuma o problema e indique claramente a pergunta.
Pergunta original :
Eu tenho esses dados ...
Eu quero fazer isso...
Quero que meu resultado fique assim ...
No entanto, quando tento fazer [isso], recebo o seguinte problema ...
Eu tentei encontrar soluções fazendo [isso] e [aquilo].
Como faço para corrigir isso?
Dependendo da quantidade de dados, código de amostra e pilhas de erros fornecidas, o leitor precisa percorrer um longo caminho antes de entender qual é o problema. Tente reafirmar sua pergunta para que ela mesma fique no topo e forneça os detalhes necessários.
Pergunta revisada :
Qustion: Como posso fazer [isso]?
Eu tentei encontrar soluções fazendo [isso] e [aquilo].
Quando tentei fazer [isso], recebi o seguinte problema ...
Gostaria que meus resultados finais fossem assim ...
Aqui está um código mínimo que pode reproduzir o meu problema ...
E aqui está como recriar meus dados de amostra:
df = pd.DataFrame({'A': [...], 'B': [...], ...})
FORNECER DADOS DE AMOSTRA SE NECESSÁRIO !!!
Às vezes, apenas a cabeça ou a cauda do DataFrame é tudo o que é necessário. Você também pode usar os métodos propostos por @JohnE para criar conjuntos de dados maiores que podem ser reproduzidos por outras pessoas. Usando seu exemplo para gerar um DataFrame de 100 linhas dos preços das ações:
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) })
Se esses eram seus dados reais, você pode incluir apenas o cabeçalho e / ou a cauda do quadro de dados da seguinte maneira (não se esqueça de anonimizar quaisquer dados confidenciais):
>>> 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'}}
Você também pode fornecer uma descrição do DataFrame (usando apenas as colunas relevantes). Isso facilita que outras pessoas verifiquem os tipos de dados de cada coluna e identifiquem outros erros comuns (por exemplo, datas como string vs. datetime64 vs. objeto):
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)
NOTA: Se o seu DataFrame tiver um MultiIndex:
Se o seu DataFrame tiver um índice múltiplo, você deve primeiro redefinir antes de ligar to_dict
. Você precisa recriar o índice usando 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