チャレンジ SOの質問への応答の中で最も挑戦的な側面の一つは、それが(データを含む)問題を再現するのにかかる時間です。データを再現する明確な方法がない質問は、回答される可能性が低くなります。時間をかけて質問を書いていて、助けてほしい問題がある場合、他の人が問題を解決するために使用できるデータを提供することで、簡単に自分を助けることができます。
良いパンダの質問を書くために@Andyが提供する指示は、始めるのに最適な場所です。詳細については、質問する方法と、最小、完全、検証可能な例を作成する方法を参照してください。
質問を前もって明確に述べてください。 時間をかけて質問とサンプルコードを作成したら、それを読んで、問題を要約し、質問を明確に示す「エグゼクティブサマリ」を読者に提供してください。
元の質問:
このデータがあります...
私はこれをしたい...
結果がこのように見えるようにしたい...
しかし、これを行おうとすると、次の問題が発生します...
私は[これ]と[それ]で解決策を見つけようとしました。
どうすれば修正できますか?
提供されるデータ、サンプルコード、エラースタックの量に応じて、読者は問題が何であるかを理解する前に長い道のりを進む必要があります。質問自体が一番上になるように質問を書き直してみてから、必要な詳細を入力してください。
改訂された質問:
質問: [これ]を行うにはどうすればよいですか?
私は[これ]と[それ]で解決策を見つけようとしました。
[これ]を実行しようとすると、次の問題が発生します...
私の最終結果がこのように見えるようにしたい...
これが私の問題を再現できる最小限のコードです...
そして、これが私のサンプルデータを再作成する方法です:
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にマルチインデックスがある場合:
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