Pandas - 解包不同长度的元组列表列
Pandas - Unpack column of lists of varying lengths of tuples
我想使用一个名为 df
的 Pandas 数据框,它有一个 ID 列和一个列表列,这些列表具有可变数量的元组,所有元组都具有相同的长度。看起来像这样:
ID list
1 [(0,1,2,3),(1,2,3,4),(2,3,4,NaN)]
2 [(Nan,1,2,3),(9,2,3,4)]
3 [(Nan,1,2,3),(9,2,3,4),(A,b,9,c),($,*,k,0)]
我想将每个列表解压缩到 'A'、'B'、'C'、'D' 列中,代表每个元组中的固定位置。
结果应如下所示:
ID A B C D
1 0 1 2 3
1 1 2 3 4
1 2 3 4 NaN
2 NaN 1 2 3
2 9 2 3 4
3 NaN 1 2 3
3 9 2 3 4
3 A b 9 c
3 $ * k 0
我已经尝试 df.apply(pd.Series(list)
但失败了,因为列表元素的 len
在不同的行上是不同的。不知何故需要解包到列并按 ID 转置?
In [38]: (df.groupby('ID')['list']
.apply(lambda x: pd.DataFrame(x.iloc[0], columns=['A', 'B', 'C', 'D']))
.reset_index())
Out[38]:
ID level_1 A B C D
0 1 0 0 1 2 3
1 1 1 1 2 3 4
2 1 2 2 3 4 NaN
3 2 0 NaN 1 2 3
4 2 1 9 2 3 4
5 3 0 NaN 1 2 3
6 3 1 9 2 3 4
7 3 2 A b 9 c
8 3 3 $ * k 0
向量化的方式是
In [2237]: dff = pd.DataFrame(np.concatenate(df['list'].values), columns=list('ABCD'))
In [2238]: dff['ID'] = df.ID.repeat(df['list'].str.len()).values
In [2239]: dff
Out[2239]:
A B C D ID
0 0.0 1.0 2.0 3.0 1
1 1.0 2.0 3.0 4.0 1
2 2.0 3.0 4.0 nan 1
3 nan 1.0 2.0 3.0 2
4 9.0 2.0 3.0 4.0 2
5 nan 1 2 3 3
6 9 2 3 4 3
7 A b 9 c 3
8 $ * k 0 3
详情
In [2240]: df
Out[2240]:
ID list
0 1 [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, nan)]
1 2 [(nan, 1, 2, 3), (9, 2, 3, 4)]
2 3 [(nan, 1, 2, 3), (9, 2, 3, 4), (A, b, 9, c), (...
我想使用一个名为 df
的 Pandas 数据框,它有一个 ID 列和一个列表列,这些列表具有可变数量的元组,所有元组都具有相同的长度。看起来像这样:
ID list
1 [(0,1,2,3),(1,2,3,4),(2,3,4,NaN)]
2 [(Nan,1,2,3),(9,2,3,4)]
3 [(Nan,1,2,3),(9,2,3,4),(A,b,9,c),($,*,k,0)]
我想将每个列表解压缩到 'A'、'B'、'C'、'D' 列中,代表每个元组中的固定位置。
结果应如下所示:
ID A B C D
1 0 1 2 3
1 1 2 3 4
1 2 3 4 NaN
2 NaN 1 2 3
2 9 2 3 4
3 NaN 1 2 3
3 9 2 3 4
3 A b 9 c
3 $ * k 0
我已经尝试 df.apply(pd.Series(list)
但失败了,因为列表元素的 len
在不同的行上是不同的。不知何故需要解包到列并按 ID 转置?
In [38]: (df.groupby('ID')['list']
.apply(lambda x: pd.DataFrame(x.iloc[0], columns=['A', 'B', 'C', 'D']))
.reset_index())
Out[38]:
ID level_1 A B C D
0 1 0 0 1 2 3
1 1 1 1 2 3 4
2 1 2 2 3 4 NaN
3 2 0 NaN 1 2 3
4 2 1 9 2 3 4
5 3 0 NaN 1 2 3
6 3 1 9 2 3 4
7 3 2 A b 9 c
8 3 3 $ * k 0
向量化的方式是
In [2237]: dff = pd.DataFrame(np.concatenate(df['list'].values), columns=list('ABCD'))
In [2238]: dff['ID'] = df.ID.repeat(df['list'].str.len()).values
In [2239]: dff
Out[2239]:
A B C D ID
0 0.0 1.0 2.0 3.0 1
1 1.0 2.0 3.0 4.0 1
2 2.0 3.0 4.0 nan 1
3 nan 1.0 2.0 3.0 2
4 9.0 2.0 3.0 4.0 2
5 nan 1 2 3 3
6 9 2 3 4 3
7 A b 9 c 3
8 $ * k 0 3
详情
In [2240]: df
Out[2240]:
ID list
0 1 [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, nan)]
1 2 [(nan, 1, 2, 3), (9, 2, 3, 4)]
2 3 [(nan, 1, 2, 3), (9, 2, 3, 4), (A, b, 9, c), (...