簡體   English   中英

如何使用熊貓分解兩列不同長度的列表

[英]How to explode two columns of lists with different length using pandas

我有一個包含兩列列表的數據框:

>>> import pandas as pd
>>> df = pd.DataFrame({'A': ['x1','x2','x3', 'x4'], 'B':[['v1','v2'],['v3','v4'],['v6'],['v7','v8']], 'C':[['c1','c2'],['c3','c4'],['c5','c6'],['c7']]})
>>> df
    A         B         C
0  x1  [v1, v2]  [c1, c2]
1  x2  [v3, v4]  [c3, c4]
2  x3      [v6]  [c5, c6]
3  x4  [v7, v8]      [c7]

我想展開 B 列和 C 列,所以輸出如下所示:

>>> df_exploded
    A         B         C
0  x1        v1        c1
1  x1        v2        c2
2  x2        v3        c3
3  x2        v4        c4
4  x3        v6        c5
5  x3        v6        c6
6  x4        v7        c7
7  x4        v8        c7

我目前的解決方案是首先將 B 列和 C 列中的元素具有相同長度的行分開,然后運行df.explode(["B", "C"]) ,對於其余行,運行df.explode("B")其次是df.explode("C")

我想知道是否有更好的解決方案。 提前致謝!

使用itertools.zip_longest

import itertools

df1 = (df.apply(lambda x: list(itertools.zip_longest(x['B'], x['C'])), axis=1)
       .explode()
       .apply(lambda x: pd.Series(x, index=['B', 'C']))
       .groupby(level=0).ffill())

df1

    B   C
0   v1  c1
0   v2  c2
1   v3  c3
1   v4  c4
2   v6  c5
2   v6  c6
3   v7  c7
3   v8  c7



使用df1獲得所需的輸出

df[['A']].join(df1)

輸出:

    A   B   C
0   x1  v1  c1
0   x1  v2  c2
1   x2  v3  c3
1   x2  v4  c4
2   x3  v6  c5
2   x3  v6  c6
3   x4  v7  c7
3   x4  v8  c7

如果你願意,你可以使用reset_index作為索引

是的,有更好的解決方案。 您可以同時對兩列使用explode方法,而不是將 B 列和 C 列中的列表長度相同的行分開,它會自動處理列表長度不同的行。 以下是您的操作方法:

df_exploded = df.explode(["B", "C"])

這將為您提供預期的輸出:

    A         B         C
0  x1        v1        c1
1  x1        v2        c2
2  x2        v3        c3
3  x2        v4        c4
4  x3        v6        c5
5  x3        v6        c6
6  x4        v7        c7
7  x4        v8        c7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM