Le défi L'un des aspects les plus difficiles de la réponse aux questions de SO est le temps nécessaire pour recréer le problème (y compris les données). Les questions qui n'ont pas de moyen clair de reproduire les données ont moins de chances de trouver une réponse. Étant donné que vous prenez le temps d'écrire une question et que vous souhaitez résoudre un problème, vous pouvez facilement vous aider en fournissant des données que d'autres pourront ensuite utiliser pour vous aider à résoudre votre problème.
Les instructions fournies par @Andy pour écrire de bonnes questions Pandas sont un excellent point de départ. Pour plus d'informations, reportez-vous à la façon de demander et comment créer des exemples Minimal, Complete et Verifiable .
Veuillez énoncer clairement votre question dès le départ. Après avoir pris le temps d'écrire votre question et tout exemple de code, essayez de le lire et de fournir un «résumé» à votre lecteur qui résume le problème et énonce clairement la question.
Question d'origine :
J'ai ces données ...
Je veux faire ça...
Je veux que mon résultat ressemble à ceci ...
Cependant, quand j'essaye de faire [ceci], j'obtiens le problème suivant ...
J'ai essayé de trouver des solutions en faisant [ceci] et [cela].
Comment je le répare?
En fonction de la quantité de données, des exemples de code et des piles d'erreurs fournis, le lecteur doit parcourir un long chemin avant de comprendre le problème. Essayez de reformuler votre question afin que la question elle-même soit en haut, puis fournissez les détails nécessaires.
Question révisée :
Qustion: Comment puis-je faire [ceci]?
J'ai essayé de trouver des solutions en faisant [ceci] et [cela].
Quand j'ai essayé de faire [ceci], j'ai le problème suivant ...
J'aimerais que mes résultats finaux ressemblent à ça ...
Voici un code minimal qui peut reproduire mon problème ...
Et voici comment recréer mes exemples de données:
df = pd.DataFrame({'A': [...], 'B': [...], ...})
FOURNIR DES EXEMPLES DE DONNÉES SI NÉCESSAIRE !!!
Parfois, seule la tête ou la queue du DataFrame suffit. Vous pouvez également utiliser les méthodes proposées par @JohnE pour créer de plus grands ensembles de données qui peuvent être reproduits par d'autres. En utilisant son exemple pour générer un DataFrame de 100 lignes de cours des actions:
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) })
S'il s'agissait de vos données réelles, vous souhaiterez peut-être simplement inclure la tête et / ou la queue de la trame de données comme suit (veillez à anonymiser toutes les données sensibles):
>>> 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'}}
Vous pouvez également vouloir fournir une description du DataFrame (en utilisant uniquement les colonnes pertinentes). Cela permet aux autres de vérifier plus facilement les types de données de chaque colonne et d'identifier d'autres erreurs courantes (par exemple, les dates sous forme de chaîne par rapport à datetime64 par rapport à l'objet):
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)
REMARQUE: si votre DataFrame a un MultiIndex:
Si votre DataFrame a un multiindex, vous devez d'abord réinitialiser avant d'appeler to_dict
. Vous devez ensuite recréer l'index en utilisant 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