パンダのバージョンが低いためにこのAPIを実装できない場合はどうすればよいですか?

この記事は、「新人クリエーションセレモニー」イベントに参加し、一緒にゴールドクリエーションの道を歩み始めました。

はじめに:数日前にツイートを公開し、パンダで非常に便利なAPIを共有しました-爆発しますが、今日は別の劇的なシーンが発生しました:パンダのバージョンが低すぎるため、システムは「シリーズ」オブジェクトに属性「爆発」がないことを促します!!まあ、良いことは常に繊細であり、この原則がコードに適用されることは期待されていません。それで、今日、私はこのトピックに関する分析を拡大して、それからパンダの乾物を少し出力します...

写真

問題の説明:pandasデータフレームデータ構造にはコレクションタイプの列があり(つまり、複数のサブ要素が含まれています)、各サブ要素を1行に展開する必要があります。このシナリオでパンダでexplodeAPIを使用すると、非常に使いやすく、シンプルで効率的になります。ただし、オンライン展開用のパンダのバージョンは0.23であり、explode APIは0.25以降のバージョンで導入されたため、使用できません。この問題を解決するには、apply+stackを柔軟に使用することでこの問題を解決できます。

写真

explode関数はバージョン0.25で追加され、ignore_indexはバージョン1.1で追加されました。

explodeは直接使用できないため、同じ効果を得るには他の方法を試す必要があります。ここでは、最初にexplodeを実行した後のターゲット効果を示します。

写真

explodeの実行後にターゲット効果を観察すると、実際には、SQL-column-to-rowの古典的な問題の味がします。つまり、列Bは実際には複数の列の集約効果と見なすことができ、複数の列に基づいて列から行への変換を実行できます。この考えに基づいて、問題は2つのサブ問題に分解できます。

  • リスト要素を含む単一の列は、複数の列に分割されます

  • 複数の列を複数の行に変換する

これらの2つのサブ問題は、パンダの豊富なAPIでは実際には比較的単純です。たとえば、1つの列が複数の列に分割されているため、実際には、次の図に示すように、pd.Seriesを使用して直接分解を完了できます。使用されるトリックの1つは、他の列情報を保持するために、最初にインデックスに配置し、最後にインデックスをリセットすることです。

写真

これまでのところ、単一列から複数列への変換は実際に完了しています。各列には異なる数の要素が含まれているため、拡張後の長さは一貫していません。パンダは最長の長さを保持し、残りをnull値で埋めます( null値が存在するため、元の整数型は自動的に10進型に変更されます)。ここでのnull値は、後続の処理で非常に役立ちます。

複数の列の展開が完了したら、次に行うことは、列を行に変換することです。つまり、複数列の情報を行ごとに表示するように変換することです。これはSQLの非常に古典的な問題であり、当然のことながら考慮されます。パンダでは、2番目のAPIであるスタックを引き出す必要があります。スタックの本来の意味はスタックです。パンダに入れるということは、要素をスタックすること、つまり幅の広いテーブルから長いテーブルに変換することを意味します。スタックの公式コメントを見てください。これは、DataFramを一連のマルチレベルインデックスに変換することです。この場合、元の列が第2レベルのインデックスになります。

写真

さて、取得したばかりの複数列のDataFrameに基づいてスタックを実行すると、列から行へのスタッキングの効果が実現され、シリーズが取得されることが予測できます。具体的には、結果は次のとおりです。

写真

同時に、列の圧縮が実現されるだけでなく、元のNaN null値の列もフィルター処理されることもわかりました。これは、予期しないゲインです。実際、スタックはデフォルトのパラメータdropna = Trueを設定するため、これは驚くべきことではありません。これまでのところ、所定の機能は基本的に実現されており、残りはデータ列への二重層インデックスをリセットするだけで済みます。もちろん、ここでリセットすると、2列のデータが追加されます。元々必要だった列に加えて、もう1列は冗長です。削除するだけで済みます。もちろん、列名を変更する必要があります。完全なコードは次のとおりです。

写真

上記の実装は直接爆発ほどエレガントではありませんが、同じ効果を達成し、実際にはより達成感がありますね。

おすすめ

転載: juejin.im/post/7100945145477988382