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