首頁 > 後端開發 > Python教學 > 如何將 Pandas DataFrame 列(或多列)解除嵌套為多行?

如何將 Pandas DataFrame 列(或多列)解除嵌套為多行?

DDD
發布: 2024-12-29 00:39:11
原創
309 人瀏覽過

How to Unnest a Pandas DataFrame Column (or Multiple Columns) into Multiple Rows?

如何將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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板