パンダ データフレームの列を複数の行にネスト解除 (展開) する方法
パンダでは、列が要素としてリストまたはオブジェクトが含まれます。このような列を個々の行に変換するには、「ネスト解除」または「展開」と呼ばれるプロセスが必要です。これにより、データをより効果的に視覚化して分析できるようになります。
問題:
列の 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 サイトの他の関連記事を参照してください。