マルチインデックスデータフレームで単一の非nan値を検索します

Bへ

編集:私は自分の問題を単純化しすぎていることに気づきました。これはおそらく、提案されたソリューションが元のブルートフォースソリューションと同じように機能すると想定したためです。問題をわかりやすくするために、多重指数を変更しました。すでに努力してくださった方々、お詫び申し上げます。ありがとうございました!

マルチインデックスのパンダデータフレームがあります。インデックスに3つのレベルがあり、2番目のレベルに色の名前が含まれているとします。各行blueで、インデックスを持つすべての列にNaN1つを除いて含まれいることを知っているので、次のようになります。

import pandas as pd
import numpy as np

iterables = [['bar', 'baz', 'foo', 'qux'], ["red", "blue", "green"], ['one', 'two']]
mi = pd.MultiIndex.from_product(iterables)

df = pd.DataFrame(np.random.randn(5, 24), columns=mi)
df[("bar", "blue","one")] = [2     , np.nan, np.nan, 3     , np.nan]
df[("baz", "blue","two")] = [np.nan, 4.4   , np.nan, np.nan, 5     ]
df[("qux", "blue","one")] = [np.nan, np.nan, 1     , np.nan, np.nan]

出力:

        bar                                               ...       qux                                             
        red           blue               green            ...       red           blue               green          
        one       two  one       two       one       two  ...       one       two  one       two       one       two
0  0.046326 -0.999092  2.0  0.073113  0.958438  0.276653  ... -0.258202 -0.772636  NaN -0.639735  1.438262 -0.033578
1  0.257776 -2.499286  NaN  0.854263 -0.037380 -0.571258  ...  1.656198 -1.110911  NaN  0.757692  0.498118  1.070371
2 -0.314146  0.941367  NaN  0.265850 -0.153231 -1.092106  ... -0.208089 -0.363624  1.0  0.046457 -2.158373  0.572496
3 -1.198977  0.605490  3.0 -0.790985  0.000563 -0.958261  ...  1.339086 -1.057270  NaN -0.355639  1.050980 -1.727684
4 -0.562230 -1.721894  NaN  0.856543 -1.137364  1.185481  ...  0.986215  1.028128  NaN -0.264889  0.571484 -0.505340

ここで、行がそれぞれの列に持つ非nan値を含み、その多重指数の他の指数にも名前を付ける新しいデータフレームを作成したいと思います。

    word number blue
0   bar  one    2.0
1   baz  two    4.4
2   qux  one    1.0
3   bar  one    3.0
4   baz  two    5.0

つまり、新しいデータフレームwordandnumberエントリは、元のデータフレームが非nan値を持っていたインデックスであり、新しいblue列には値が含まれている必要があります。

基本的にすべてのエントリを反復処理するブルートフォースソリューションがありますが、最終的なデータフレームには約2000列が含まれ、実行に非常に時間がかかります。

ジェズリール

で選択した場合DataFrame.xsのみによって再構築DataFrame.stack、することにより、第1マルチインデックスレベルを削除reset_indexしてdrop=True、最後の変換Series2DataFrameによるSeries.rename_axisSeries.reset_index

df = (df.xs('blue', axis=1, level=1)
        .stack()
        .reset_index(level=0, drop=True)
        .rename_axis('number')
        .reset_index(name='blue'))
print (df)
   number  blue
0       1   2.0
1       2   4.4
2       3   1.0
3       1   3.0
4       2   5.0

編集:解決策は似ていますが、少なくとも1つNaNの列をDataFrame.isnaDataFrame.anyフィルタリングするだけで、両方のレベルでDataFrame.loc使用さDataFrame.stackMultiIndexます。

df1 = (df.loc[:, df.isna().any()]
         .xs('blue', axis=1, level=1)
         .stack([0,1])
         .reset_index(level=0, drop=True)
         .rename_axis(('word','number'))
         .reset_index(name='blue'))

print (df1)
  word number  blue
0  bar    one   2.0
1  baz    two   4.4
2  qux    one   1.0
3  bar    one   3.0
4  baz    two   5.0

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マルチインデックスデータフレームのインデックス値をPythonの単純なリストとして抽出します

分類Dev

データフレームの特定の列で最大値の行インデックスを検索します

分類Dev

データフレーム列で重複値のインデックスを検索します

分類Dev

ダブルインデックスのGroupbyデータフレームで最小値の内部インデックスを検索します

分類Dev

パンダを使用して、データフレーム列で厳密に一致する値のインデックスを検索します

分類Dev

Pandasマルチインデックスデータフレームの行をインデックス値で連結します

分類Dev

2つの単一インデックスデータフレームに、選択したレベルのマルチインデックスデータフレームを乗算します

分類Dev

python pandas:マルチインデックスデータフレームの単一列ラベルの名前を変更します

分類Dev

インデックス値が存在しない場合、マルチインデックスデータフレームで値を伝播します

分類Dev

複数の.csvデータフレームをマルチインデックスで連結します

分類Dev

複数の.csvデータフレームをマルチインデックスで連結します

分類Dev

マルチインデックスデータフレームからのデータの検索と処理

分類Dev

Pandasデータフレームで最新のDateTimeのインデックスを検索します

分類Dev

パンダは、別の単一インデックスデータフレームに基づいてマルチインデックスデータフレームをクエリします

分類Dev

単一のベクトルからデータフレームの値を検索します

分類Dev

単一の列による階層インデックスを持つPandasデータフレームを検索します

分類Dev

マルチインデックス付きのデータフレームフィルター:値フィルターを指定して、最上位のインデックスレベルですべての行を返します

分類Dev

パンダ:マルチインデックスデータフレームのNaNを削除して、多くの行を1つの行にまとめます

分類Dev

マルチインデックス/マルチレベルデータフレームを単一インデックス、単一レベルに削減

分類Dev

列データフレームの値を使用して列インデックスを検索する

分類Dev

マルチインデックスの pandas データフレームを単一のインデックスに変換する

分類Dev

データフレームはすべてのnanインデックスを削除し、セルは元のインデックス値を保持します

分類Dev

インデックスのリストを指定して、マルチインデックスデータフレームからデータを取得します

分類Dev

マルチインデックスを使用してパンダデータフレームの単一行を複数行に合計する方法は?

分類Dev

パンダの別のデータフレームの列と等しいインデックス値を持つマルチレベルインデックスデータフレームの行を選択します

分類Dev

pandasデータフレームで連続するものの開始インデックスと終了インデックスを検索します

分類Dev

パンダのマルチインデックスデータフレームを、すべてのインデックスが列に含まれる単純なデータフレームに変換します

分類Dev

マルチインデックスデータフレームから特定の行を削除します

分類Dev

データフレームの各行の要素の列インデックスを検索します

Related 関連記事

  1. 1

    マルチインデックスデータフレームのインデックス値をPythonの単純なリストとして抽出します

  2. 2

    データフレームの特定の列で最大値の行インデックスを検索します

  3. 3

    データフレーム列で重複値のインデックスを検索します

  4. 4

    ダブルインデックスのGroupbyデータフレームで最小値の内部インデックスを検索します

  5. 5

    パンダを使用して、データフレーム列で厳密に一致する値のインデックスを検索します

  6. 6

    Pandasマルチインデックスデータフレームの行をインデックス値で連結します

  7. 7

    2つの単一インデックスデータフレームに、選択したレベルのマルチインデックスデータフレームを乗算します

  8. 8

    python pandas:マルチインデックスデータフレームの単一列ラベルの名前を変更します

  9. 9

    インデックス値が存在しない場合、マルチインデックスデータフレームで値を伝播します

  10. 10

    複数の.csvデータフレームをマルチインデックスで連結します

  11. 11

    複数の.csvデータフレームをマルチインデックスで連結します

  12. 12

    マルチインデックスデータフレームからのデータの検索と処理

  13. 13

    Pandasデータフレームで最新のDateTimeのインデックスを検索します

  14. 14

    パンダは、別の単一インデックスデータフレームに基づいてマルチインデックスデータフレームをクエリします

  15. 15

    単一のベクトルからデータフレームの値を検索します

  16. 16

    単一の列による階層インデックスを持つPandasデータフレームを検索します

  17. 17

    マルチインデックス付きのデータフレームフィルター:値フィルターを指定して、最上位のインデックスレベルですべての行を返します

  18. 18

    パンダ:マルチインデックスデータフレームのNaNを削除して、多くの行を1つの行にまとめます

  19. 19

    マルチインデックス/マルチレベルデータフレームを単一インデックス、単一レベルに削減

  20. 20

    列データフレームの値を使用して列インデックスを検索する

  21. 21

    マルチインデックスの pandas データフレームを単一のインデックスに変換する

  22. 22

    データフレームはすべてのnanインデックスを削除し、セルは元のインデックス値を保持します

  23. 23

    インデックスのリストを指定して、マルチインデックスデータフレームからデータを取得します

  24. 24

    マルチインデックスを使用してパンダデータフレームの単一行を複数行に合計する方法は?

  25. 25

    パンダの別のデータフレームの列と等しいインデックス値を持つマルチレベルインデックスデータフレームの行を選択します

  26. 26

    pandasデータフレームで連続するものの開始インデックスと終了インデックスを検索します

  27. 27

    パンダのマルチインデックスデータフレームを、すべてのインデックスが列に含まれる単純なデータフレームに変換します

  28. 28

    マルチインデックスデータフレームから特定の行を削除します

  29. 29

    データフレームの各行の要素の列インデックスを検索します

ホットタグ

アーカイブ