我正在处理这样的数据集,我想用每个列表的内容来分解它。
index col1 col2 col3
1 [A,B] [,xx] [1,2]
2 [A,C] [zz,xx] [3,4]
3 [D,] [zz,yy] [2,2]
但是,
[,xx]
和[D,]
中的缺失值会产生错误,我正在寻找一种方法来填充这些列表中的空位置。
我的想法是填充列表中的空白以获得类似
[NaN,xx]
和 [D,NaN]
的内容,而不指定列表中的索引,因为空白并不总是位于相同的位置。
我怎样才能实现这个目标?
[,xx]
(或[,'xx']
)不能是有效的Python对象。
[,'xx']
# SyntaxError: invalid syntax
只有
['xx']
可以,但在这种情况下,无法区分将转换为 ['xx', NaN]
或 [NaN, 'xx']
的内容。
因此,假设您有类似列表对象的字符串表示(
'[,xx]'
),您可以在爆炸之前剥离[
/]
并在,
上拆分:
cols = ['col1', 'col2', 'col3']
out = (df[cols]
.applymap(lambda x: x.strip('[]').split(',')) # convert to lists
.explode(cols) # explode
.join(df.drop(columns=cols))[df.columns] # add other columns
)
注意。在最新版本的 pandas 中,将
applymap
替换为 map
。
输出:
index col1 col2 col3
0 1 A 1
0 1 B xx 2
1 2 A zz 3
1 2 C xx 4
2 3 D zz 2
2 3 yy 2
使用的输入:
df = pd.DataFrame({'index': [1, 2, 3],
'col1': ['[A,B]', '[A,C]', '[D,]'],
'col2': ['[,xx]', '[zz,xx]', '[zz,yy]'],
'col3': ['[1,2]', '[3,4]', '[2,2]']})