1. ホーム
  2. パイソン

[解決済み】再現性の高いpandasのサンプルを作るには?

2022-04-09 01:32:09

質問

を見るのに十分な時間を費やしました。 r パンダ タグをSOで使用した場合、その印象は pandas の質問には、再現可能なデータが含まれる可能性が低くなります。これはRコミュニティが推奨していることであり、以下のようなガイドのおかげです。 これ 初心者は、このような例題を作成するためのヘルプを得ることができます。これらのガイドを読んで、再現可能なデータを持ってくることができる人は、しばしば、質問に対する答えを得るのに、より良い運を持っています。

の再現性の高い例を作るにはどうしたらいいでしょうか? pandas という質問があります。簡単なデータフレームはまとめることができます、例えば。

import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'], 
                   'income': [40000, 50000, 42000]})

しかし、多くのサンプルデータセットでは、例えばもっと複雑な構造を必要とします。

  • datetime インデックスまたはデータ
  • 複数のカテゴリー変数(Rの expand.grid() 関数は、与えられた変数のすべての可能な組み合わせを生成しますか?)
  • MultiIndexまたはPanelデータ

数行のコードでモックアップするのが難しいデータセットのために、Rの dput() コピーペースト可能なコードを生成して、データ構造を再生成することができるのでしょうか?

どのように解決するのですか?

注:ここでのアイデアは、Stack Overflowではかなり一般的なものです。 質問 .

免責事項:良い質問を書くことは ハード .

良かった点

  • 実行可能なコードとして、小さな*サンプルDataFrameが含まれています。

      In [1]: df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])
    
    

    を使用してコピー&ペーストできるようにします。 pd.read_clipboard(sep='\s\s+') を使用すると、Stack Overflow のハイライト用にテキストをフォーマットすることができます。 Ctrl + K (または、各行に4つのスペースを前置する) または、コードの上下に3つのバックスティック (```) を置き、コードをインデントしないようにします。

      In [2]: df
      Out[2]:
         A  B
      0  1  2
      1  1  3
      2  4  6
    
    

    テスト pd.read_clipboard(sep='\s\s+') を自分自身に置き換えてみてください。

    * 私は本当に 小さい ということは、ほとんどのDataFrameは6行以下である可能性があります。 要引用回数 そして 5列でできるに違いない。 でエラーを再現できますか? df = df.head() ? そうでない場合は、あなたが直面している問題を示す小さなデータフレームを作成できるかどうかを確認するためにいじくり回してください。

    * すべてのルールには例外があり、明らかなのはパフォーマンスの問題の場合です ( この場合、%timeit と、場合によっては %prun を使ってください。 ) を生成する必要があります (np.random.seed を使用して、まったく同じフレームを持つようにすることを検討してください)。 df = pd.DataFrame(np.random.randn(100000000, 10)) . とはいえ、quot;make this code fast for me"は、厳密にはサイトのトピックではないのですが......。

  • 望む結果を書き出す(上記と同様)

      In [3]: iwantthis
      Out[3]:
         A  B
      0  1  5
      1  4  6
    
    

    数字の由来を説明すると、Aが1である行のB列の合計が5である。

  • ドゥ・ショー コード を試してみてください。

      In [4]: df.groupby('A').sum()
      Out[4]:
         B
      A
      1  5
      4  6
    
    

    しかし、何が間違っているかと言うと、A列は列ではなくインデックスにあるのです。

  • 調べたことをアピールする ( ドキュメントを検索する , 検索 Stack Overflow ) を作成し、概要を説明します。

    <ブロッククオート

    sum の docstring には、単に "グループ値の合計を計算する" と記載されています。

    <ブロッククオート

    その groupby ドキュメント は、これに関する例を示していません。

    余談:ここでの回答は df.groupby('A', as_index=False).sum() .

  • Timestampカラムを持つことが重要な場合、例えば、リサンプリングを行っている場合などは、明示的に適用してください。 pd.to_datetime を追加することで、より効果的な対策ができます。

      df['date'] = pd.to_datetime(df['date']) # this column ought to be date..
    
    

    ** 文字列だったという、この問題そのものであることもあります。

悪いこと

  • は、MultiIndexを含まない。 コピー&ペーストができない (上記参照)。これはPandasのデフォルトの表示に対する不満のようなものですが、それにもかかわらず、迷惑です。

      In [11]: df
      Out[11]:
           C
      A B
      1 2  3
        2  6
    
    

    正しい方法は、通常のDataFrameを set_index を呼び出します。

      In [12]: df = pd.DataFrame([[1, 2, 3], [1, 2, 6]], columns=['A', 'B', 'C']).set_index(['A', 'B'])
    
      In [13]: df
      Out[13]:
           C
      A B
      1 2  3
        2  6
    
    
  • あなたが望む結果を与えるときにそれが何であるかについての洞察を提供します。

         B
      A
      1  1
      5  0
    
    

    数字の出し方(内容)を具体的に・・・正しいかどうか再確認してください。

  • コードがエラーをスローした場合、スタックトレース全体を含めるようにしてください(ノイズが多い場合は後で編集できます)。行番号 (と、そのエラーが発生したコードの対応する行) を表示します。

醜いこと

  • にリンクしないようにしましょう。 CSV ファイルにアクセスできない(外部ソースにまったくリンクしないのが理想だが...)。

      df = pd.read_csv('my_secret_file.csv')  # ideally with lots of parsing options
    
    

    ほとんどのデータがプロプライエタリ それはわかった。似たようなデータを作って、問題が再現できるかどうか(小さなことでいいので)。

  • 漠然とした言葉で状況を説明するのではなく、例えば、DataFrame が "large" で、カラム名のいくつかに一応触れておく(dtypes には言及しないように注意)。実際の文脈を見なければ全く意味のないことを、詳細に説明しようとする。おそらく、誰もこのパラグラフを最後まで読もうとはしないでしょう。

    エッセイはダメだ、小さな例があれば簡単だ。

  • 10行以上(100行以上?)のデータの説明をしてから実際の質問に入るのはやめてください。

    お願いです、私たちは本業でこのようなことを十分見ています。お手伝いしたいのですが こんなんじゃダメだ...。 . イントロをカットして、問題のあるステップに関連するDataFrame(またはその縮小版)だけを表示します。

とにかく、Python、NumPy、Pandasの学習を楽しんでください。