1. ホーム
  2. python

[解決済み] データフレームセルの中のリストを分割して表示する方法

2022-12-20 19:45:14

質問

リストを含むpandasセルを、それぞれの値の行に変えたいと思っています。

そこで、これを

の値を解凍して積み重ねたいのであれば、このようにします。 nearest_neighbors カラムの値を展開して積み重ね、各値が各 opponent インデックスを作成する必要がありますが、どのようにすればよいのでしょうか?このような操作のためのpandasメソッドはありますか?

どのように解決するのですか?

以下のコードでは、まずインデックスをリセットして、行の繰り返しを容易にします。

外側のリストの各要素が目的のDataFrameの行で、内側のリストの各要素が列の1つであるリストのリストを作成します。 このネストされたリストは最終的に連結され、目的のDataFrameが作成されます。

を使っています。 lambda の各要素に対して行を作成するために、リストの反復処理と一緒に関数を使用します。 nearest_neighbors の各要素と関連する nameopponent .

最後に、このリストから新しいDataFrameを作成します(元のカラム名を使用し、インデックスを nameopponent ).

df = (pd.DataFrame({'name': ['A.J. Price'] * 3, 
                    'opponent': ['76ers', 'blazers', 'bobcats'], 
                    'nearest_neighbors': [['Zach LaVine', 'Jeremy Lin', 'Nate Robinson', 'Isaia']] * 3})
      .set_index(['name', 'opponent']))

>>> df
                                                    nearest_neighbors
name       opponent                                                  
A.J. Price 76ers     [Zach LaVine, Jeremy Lin, Nate Robinson, Isaia]
           blazers   [Zach LaVine, Jeremy Lin, Nate Robinson, Isaia]
           bobcats   [Zach LaVine, Jeremy Lin, Nate Robinson, Isaia]

df.reset_index(inplace=True)
rows = []
_ = df.apply(lambda row: [rows.append([row['name'], row['opponent'], nn]) 
                         for nn in row.nearest_neighbors], axis=1)
df_new = pd.DataFrame(rows, columns=df.columns).set_index(['name', 'opponent'])

>>> df_new
                    nearest_neighbors
name       opponent                  
A.J. Price 76ers          Zach LaVine
           76ers           Jeremy Lin
           76ers        Nate Robinson
           76ers                Isaia
           blazers        Zach LaVine
           blazers         Jeremy Lin
           blazers      Nate Robinson
           blazers              Isaia
           bobcats        Zach LaVine
           bobcats         Jeremy Lin
           bobcats      Nate Robinson
           bobcats              Isaia

EDIT JUNE 2017

別の方法として、次のような方法があります。

>>> (pd.melt(df.nearest_neighbors.apply(pd.Series).reset_index(), 
             id_vars=['name', 'opponent'],
             value_name='nearest_neighbors')
     .set_index(['name', 'opponent'])
     .drop('variable', axis=1)
     .dropna()
     .sort_index()
     )