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

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

Patricia Arquette
發布: 2024-12-30 19:21:10
原創
294 人瀏覽過

How to Unnest List Columns in Pandas DataFrames?

使用 Pandas 解除列巢狀

處理包含清單列的 DataFrame 時,將這些清單「展開」為單獨的行可能會很有用。

方法一:使用DataFrame.explode() (Pandas >= 0.25)

對於單列爆炸,直接使用explode():

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

df_exploded = df.explode('B')
登入後複製

方法二:應用Series

df_exploded = df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
登入後複製

方法三:重複DataFrame

df_exploded = pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)})
登入後複製

方法4:重新索引/Loc

df_exploded = df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
登入後複製

方法5:ChainMap

from collections import ChainMap
d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A'])))
df_exploded = pd.DataFrame(list(d.items()),columns=df.columns[::-1])
登入後複製

方法6:Numpy

newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
df_exploded = pd.DataFrame(data=newvalues[0],columns=df.columns)
登入後複製

方法7:迭代器

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]
df_exploded = pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)
登入後複製

泛化到多列

到將上述方法推廣到多列,請使用以下函數:

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')
登入後複製

以列取消嵌套

要水平取消嵌套,請修改函數:

def unnesting(df, explode, axis):
    if axis==1:
        # Previous implementation
    else :
        df1 = pd.concat([
                         pd.DataFrame(df[x].tolist(), index=df.index).add_prefix(x) for x in explode], axis=1)
        return df1.join(df.drop(explode, 1), how='left')
登入後複製

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

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