如何將Pandas DataFrame 中的列取消嵌套為多行
使用Pandas 進行資料操作的挑戰之一是處理包含以下內容的列列表。當這些清單類型的列需要拆分為單獨的行時,該過程稱為「取消嵌套」或「爆炸」。
Pandas 取消巢狀方法
方法1:pandas.DataFrame.explode
對於有要嵌套單列,可以使用pandas.DataFrame.explode 函數。它將列名作為參數。
df.explode('B') # dataframe with column 'B' containing lists
方法 2:使用 Repeat 和 DataFrame 建構子
此方法結合了 Repeat 和 DataFrame 建構子。它根據列表的長度重複列中的值,然後將它們連接起來。
df = pd.DataFrame({'A': df.A.repeat(df.B.str.len()), 'B': np.concatenate(df.B.values)})
方法3:重新建立列表
重新建立列表列表涉及將舊列轉換為元組列表,其中包含該列的值和該列的每個元素list.
pd.DataFrame([[x] + [z] for x, y in df.values for z in y], columns=df.columns)
方法4:使用Reindex
Reindex 建立一個新的 DataFrame,其中包含清單中元素的重複索引。然後為該列分配串聯元素。
df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
泛化為多個欄位
對於取消巢狀多個欄位,可以定義自訂函數。它需要 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')
水平取消巢狀
要水平取消巢狀,可以使用 add_prefix 方法建立一個系列新欄位。
df.join(pd.DataFrame(df.B.tolist(), index=df.index).add_prefix('B_'))
以上是如何將 Pandas DataFrame 列(或多列)解除嵌套為多行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!