ホームページ > バックエンド開発 > Python チュートリアル > Pandas DataFrame 列を複数の行にネスト解除するにはどうすればよいですか?

Pandas DataFrame 列を複数の行にネスト解除するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-21 00:47:09
オリジナル
507 人が閲覧しました

How to Unnest a Pandas DataFrame Column into Multiple Rows?

Pandas DataFrame で列を複数の行にネスト解除する方法

問題:

1 つの列に値のリストが含まれる DataFrame があり、各リスト要素をその要素に分割したいとします。

解決策:

Pandas DataFrame で列をネスト解除 (または分解) するには、いくつかのメソッドがあります:

メソッド1: 爆発を使用する (パンダ >= 0.25)

ネストを解除する列が 1 つある場合、explode 関数が最も簡単な解決策です。

df.explode('B')
ログイン後にコピー

方法 2: apply と pd.Series を使用する

この方法は簡単ですが、パフォーマンスの点で推奨されません理由:

df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
ログイン後にコピー

方法 3:repeat と DataFrame コンストラクターを使用する

ネストされていない列に繰り返し値を含む新しい DataFrame を作成します:

df=pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)})
ログイン後にコピー

方法 4: 再インデックスを使用するか、 loc

ネストされていない値を使用して新しい DataFrame を作成し、reindex または loc を使用して元のデータフレームと位置合わせします。

df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
ログイン後にコピー

方法 5: collections.ChainMap を使用する (リストに一意のものが含まれる場合値)

from collections import ChainMap
d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A'])))
pd.DataFrame(list(d.items()),columns=df.columns[::-1])
ログイン後にコピー

方法 6: Numpy を使用して高パフォーマンスを実現する

この方法は、前の方法よりも効率的です:

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.cycle とitertools.chain

楽しみのための純粋な Python ソリューション:

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)
ログイン後にコピー

複数の列への一般化:

次の関数を使用すると、次のことが可能になります。複数の列のネストを解除するDataFrame:

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 コンストラクターの add_prefix メソッドを使用します:

df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))
ログイン後にコピー

以上がPandas DataFrame 列を複数の行にネスト解除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート