挑战回答SO问题的最大挑战之一是重新创建问题(包括数据)所花费的时间。没有清晰的方法来重现数据的问题不太可能被回答。既然您花时间写问题,并且有一个需要帮助的问题,则可以通过提供其他人可以用来帮助解决问题的数据来轻松地帮助自己。
@Andy提供的有关编写良好熊猫问题的说明是一个很好的起点。有关更多信息,请参阅如何提问以及如何创建最小,完整和可验证的示例。
请事先明确说明您的问题。 花时间写完您的问题和任何示例代码后,请尝试阅读并为您的读者提供一个“执行摘要”,其中概述了问题并清楚地陈述了问题。
原始问题:
我有这个数据...
我想做这个...
我希望我的结果看起来像这样...
但是,当我尝试执行[this]时,出现以下问题...
我试图通过[this]和[that]找到解决方案。
我如何解决它?
根据所提供的数据量,示例代码和错误堆栈,读者需要走很长一段路才能理解问题所在。尝试重新陈述问题,使问题本身排在最前面,然后提供必要的详细信息。
修改后的问题:
问题: 我该怎么做?
我试图通过[this]和[that]找到解决方案。
当我尝试执行此操作时,出现以下问题...
我希望最终结果看起来像这样...
这是一些可以重现我的问题的最小代码...
这里是如何重新创建示例数据的方法:
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的描述(仅使用相关列)。这使得其他人更容易检查每一列的数据类型并识别其他常见错误(例如,日期为字符串vs. datetime64 vs.对象):
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