[英]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.