ホームページ >バックエンド開発 >Python チュートリアル >Pandas DataFrames でリストを含む列のネストを解除する方法

Pandas DataFrames でリストを含む列のネストを解除する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 22:58:14903ブラウズ

How to Unnest List-Containing Columns in Pandas DataFrames?

パンダ データフレームの列を複数の行にネスト解除 (展開) する方法

パンダでは、列が要素としてリストまたはオブジェクトが含まれます。このような列を個々の行に変換するには、「ネスト解除」または「展開」と呼ばれるプロセスが必要です。これにより、データをより効果的に視覚化して分析できるようになります。

問題:

列の 1 つ 'B' にリストが含まれる DataFrame を考えます:

df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})

   A       B
0  1  [1, 2]
1  2  [1, 2]

予想出力:

必要な出力は、'B' 列の各要素が個別の行として表される DataFrame です:

   A  B
0  1  1
1  1  2
3  2  1
4  2  2

解決策:

方法 1: 分解するFunction

Pandas バージョン 0.25 以降、ネスト解除に pandas.DataFrame.explode 関数を使用できるようになりました。この関数は、特定の列を効率的に展開し、リスト要素ごとに新しい行を作成します。

df.explode('B')

   A  B
0  1  1
1  1  2
0  2  1
1  2  2

方法 2: pd.Series を適用する

もう 1 つのアプローチは、apply を組み合わせることです。 pd.Seriesで機能します。このメソッドは、'B' 列の各行を処理し、その要素を個別の Series オブジェクトに分割します。

df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})

メソッド 3: DataFrame コンストラクター

または、次のこともできます。 DataFrame コンストラクターを使用してデータを再形成します。これには、リスト内の要素の数と一致するように行インデックスを繰り返し、それらを 1 つの列に連結することが含まれます。

df = pd.DataFrame({'A':df.A.repeat(df.B.str.len()), 'B':np.concatenate(df.B.values)})

方法 4: 再インデックスまたは loc

reindex または loc を使用すると、展開された値を収容できるように DataFrame を拡張できます。欠損値を「B」列の要素で埋めます。

df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))

方法 5: リストの内包

簡潔な方法では、次を使用してリストのリストを作成します。リスト内包表記を取得してから、それをDataFrame.

pd.DataFrame([[x] + [z] for x, y in df.values for z in y],columns=df.columns)

方法 6: Numpy

パフォーマンス重視のシナリオの場合、numpy はベクトル化された操作を提供します。このメソッドは、np.dstack を使用してデータを再形成し、新しい DataFrame を作成します。

newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
pd.DataFrame(data=newvalues[0],columns=df.columns)

メソッド 7: Itertools

itertools パッケージを使用すると、要素を組み合わせて新しいものを作成しますDataFrame.

from itertools import cycle, chain
l=df.values.tolist()
l1=[list(zip([x[0]], cycle(x[1])) if len([x[0]]) > len(x[1]) else list(zip(cycle([x[0]]), x[1]))) for x in l]
pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)

複数の列への一般化:

これらのメソッドを複数の列に拡張するには、列名を入力として受け取るカスタム関数を定義し、ネスト解除操作を実行します。

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')

列方向ネスト解除:

水平方向に「ネスト解除」する場合、つまり要素を行内で展開する場合は、DataFrame コンストラクターを使用できます。

df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))

結論:

これらのメソッドは、pandas DataFrame 内のデータのネストを解除するための柔軟なオプションを提供します。パフォーマンスと可読性の要件に最も適したアプローチを選択してください。

以上がPandas DataFrames でリストを含む列のネストを解除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。