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

Pandas DataFrames のリスト列のネストを解除する方法?

Patricia Arquette
リリース: 2024-12-30 19:21:10
オリジナル
294 人が閲覧しました

How to Unnest List Columns in Pandas DataFrames?

Pandas で列のネストを解除する

リストの列を含む DataFrame を扱う場合、これらのリストを個別の行に「展開」すると便利です。

方法 1: DataFrame.explode() を使用する (Pandas >= 0.25)

単一列の爆発の場合は、explode() を直接使用します。

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

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

方法 2: シリーズを適用

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

方法 3: DataFrame を繰り返す

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

方法 4: Reindex/Loc

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

メソッド 5: ChainMap

from collections import ChainMap
d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A'])))
df_exploded = 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)))
df_exploded = pd.DataFrame(data=newvalues[0],columns=df.columns)
ログイン後にコピー

メソッド 7: イテレータ

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

列方向のネスト解除

水平方向にネストを解除するには、関数を変更します:

def unnesting(df, explode, axis):
    if axis==1:
        # Previous implementation
    else :
        df1 = pd.concat([
                         pd.DataFrame(df[x].tolist(), index=df.index).add_prefix(x) for x in explode], axis=1)
        return df1.join(df.drop(explode, 1), how='left')
ログイン後にコピー

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

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