首頁 > 後端開發 > Python教學 > 如何取消 Pandas DataFrame 中包含清單的列的嵌套?

如何取消 Pandas DataFrame 中包含清單的列的嵌套?

Barbara Streisand
發布: 2024-12-20 22:58:14
原創
899 人瀏覽過

How to Unnest List-Containing Columns in Pandas DataFrames?

如何將Pandas DataFrame 中的列取消巢狀(分解)為多行

在pandas 中,您可能會遇到列包含列表或物件作為元素。要將這樣的列轉換為單獨的行,需要一個稱為「取消巢狀」或「爆炸」的過程。這使您可以更有效地視覺化和分析數據。

問題:

考慮一個DataFrame,其中一列「B」包含清單:

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

   A       B
0  1  [1, 2]
1  2  [1, 2]
登入後複製

預期輸出:

預計輸出:
   A  B
0  1  1
1  1  2
3  2  1
4  2  2
登入後複製

預計輸出:

所需的輸出是一個DataFrame,其中「B」列的每個元素表示為單獨的行:

解決方案:
df.explode('B')

   A  B
0  1  1
1  1  2
0  2  1
1  2  2
登入後複製

方法一:爆炸函數

從Pandas 0.25 版本開始,可以使用pandas.DataFrame.explode函數進行取消巢狀。此函數有效地分解特定列,為每個列表元素建立新行。
df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
登入後複製

方法 2:應用 pd.Series

另一種方法是將 apply 結合起來與 pd.Series 的功能。此方法處理「B」列的每一行,並將其元素拆分為單獨的 Series 物件。
df = pd.DataFrame({'A':df.A.repeat(df.B.str.len()), 'B':np.concatenate(df.B.values)})
登入後複製

方法 3:DataFrame 建構子

或者,您可以使用 DataFrame 建構子來重塑資料。這涉及重複行索引以匹配清單中的元素數量並將它們連接到單一列。
df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
登入後複製

方法 4:重新索引或 loc

使用 reindex 或 loc 讓您擴充 DataFrame 以容納分解的值。使用“B”列中的元素填入缺失值。
pd.DataFrame([[x] + [z] for x, y in df.values for z in y],columns=df.columns)
登入後複製

方法 5:列表理解

一種簡潔的方法涉及使用以下命令創建列表列表列表理解,然後將其轉換為 DataFrame。
newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
pd.DataFrame(data=newvalues[0],columns=df.columns)
登入後複製

方法 6: Numpy

對於效能密集場景,numpy 提供向量化運算。此方法使用 np.dstack 重塑資料並建立一個新的 DataFrame。
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]
pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)
登入後複製

方法 7:Itertools

利用 itertools包,您可以迭代元素並將它們組合起來創建一個新的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')
登入後複製

泛化為多列:

要將這些方法擴展到多列,您可以定義一個自訂函數,該函數將列名稱作為輸入並執行取消巢狀操作。
df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))
登入後複製

按列取消巢狀:

如果你想水平“取消巢狀”,即展開一行中的元素,可以使用 DataFrame 建構函數。 結論:

這些方法為取消 pandas DataFrame 中的資料嵌套提供了靈活的選項。選擇最適合您的效能和可讀性要求的方法。

以上是如何取消 Pandas DataFrame 中包含清單的列的嵌套?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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