Pandas DataFrame のカンマ区切りの文字列エントリを分割して個別の行を作成する
問題:
1 つの列にカンマ区切りの値を持つ文字列を含む Pandas DataFrame があります。各 CSV エントリを分割し、一意の値ごとに新しい行を作成したいと考えています。たとえば、「a,b,c」は「a」、「b」、「c」になります。
解決策:
オプション 1: DataFrame.explode() (Pandas 0.25.0 )
DataFrame.explode() メソッドは、この目的のために特別に設計されています。これにより、リストのような列 (この場合はカンマ区切りの文字列) を個々の行に分割できます。
In [1]: df.explode('var1') Out[1]: var1 var2 var3 0 a 1 XX 1 b 1 XX 2 c 1 XX 3 d 2 ZZ 4 e 2 ZZ 5 f 2 ZZ 6 x 2 ZZ 7 y 2 ZZ
オプション 2: カスタム ベクトル化関数
DataFrame.explode() が利用できない場合、またはさらにカスタマイズが必要な場合は、独自のベクトル化されたデータを作成できます関数:
import numpy as np def explode(df, lst_cols, fill_value='', preserve_index=False): # Convert `lst_cols` to a list if it is a string. if isinstance(lst_cols, str): lst_cols = [lst_cols] # Calculate the lengths of each list in `lst_cols`. lens = df[lst_cols[0]].str.len() # Create a new index based on the lengths of the lists. idx = np.repeat(df.index.values, lens) # Create a new DataFrame with the exploded columns. exp_df = pd.DataFrame({ col: np.repeat(df[col].values, lens) for col in df.columns.difference(lst_cols) }, index=idx).assign(**{ col: np.concatenate(df.loc[lens > 0, col].values) for col in lst_cols }) # Append rows with empty lists if necessary. if (lens == 0).any(): exp_df = exp_df.append(df.loc[lens == 0, df.columns.difference(lst_cols)], sort=False).fillna(fill_value) # Revert the original index order and reset the index if requested. exp_df = exp_df.sort_index() if not preserve_index: exp_df = exp_df.reset_index(drop=True) return exp_df
使用例:
In [2]: explode(df, 'var1') Out[2]: var1 var2 var3 0 a 1 XX 1 b 1 XX 2 c 1 XX 3 d 2 ZZ 4 e 2 ZZ 5 f 2 ZZ 6 x 2 ZZ 7 y 2 ZZ
以上がPandas DataFrame のカンマ区切りの文字列を別々の行に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。