Задача Одним из наиболее сложных аспектов ответа на вопросы SO является время, необходимое для воссоздания проблемы (включая данные). На вопросы, которые не имеют четкого способа воспроизвести данные, менее вероятно, что на них будут даны ответы. Учитывая, что у вас есть время, чтобы написать вопрос, и у вас есть проблема, с которой вы хотели бы помочь, вы можете легко помочь себе, предоставив данные, которые другие затем могут использовать для решения вашей проблемы.
Инструкции @Andy по написанию хороших вопросов для Pandas - отличное место для начала. Для получения дополнительной информации обратитесь к тому, как спрашивать и как создавать минимальные, полные и проверяемые примеры .
Пожалуйста, четко сформулируйте свой вопрос заранее. Потратив время на написание вашего вопроса и любого примера кода, попробуйте прочитать его и предоставьте вашему руководителю «Резюме», в котором кратко изложена проблема и четко сформулирован вопрос.
Оригинальный вопрос :
У меня есть эти данные ...
Я хочу сделать это...
Я хочу, чтобы мой результат выглядел следующим образом ...
Однако, когда я пытаюсь сделать [это], я получаю следующую проблему ...
Я пытался найти решения, делая [это] и [это].
Как мне это исправить?
В зависимости от объема данных, примера кода и стеков ошибок, читатель должен пройти долгий путь, прежде чем понять, в чем проблема. Попробуйте переформулировать свой вопрос так, чтобы сам вопрос был на вершине, а затем предоставьте необходимые детали.
Пересмотренный вопрос :
Вопрос: Как я могу сделать это?
Я пытался найти решения, делая [это] и [это].
Когда я попытался сделать [это], я получил следующую проблему ...
Я бы хотел, чтобы мои окончательные результаты выглядели так ...
Вот некоторый минимальный код, который может воспроизвести мою проблему ...
А вот как воссоздать мои образцы данных:
df = pd.DataFrame({'A': [...], 'B': [...], ...})
ПРЕДОСТАВИТЬ ОБРАЗЕЦ ДАННЫХ, ЕСЛИ НУЖНО !!!
Иногда только голова или хвост DataFrame - это все, что нужно. Вы также можете использовать методы, предложенные @JohnE, для создания больших наборов данных, которые могут быть воспроизведены другими. Используя его пример для генерации 100 строк DataFrame цен на акции:
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'}}
Вы также можете предоставить описание DataFrame (используя только соответствующие столбцы). Это упрощает для других проверку типов данных каждого столбца и выявление других распространенных ошибок (например, даты в виде строки против datetime64 против объекта):
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