爆炸Pandas数据框,处理元素数量不匹配
我在处理一个这样的数据集,想要把每个列表里的内容拆分开来。
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]
,而不需要指定列表中的具体位置,因为空白的位置并不总是一样的。
请问我该怎么做呢?
2 个回答
0
[,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]']})
0
如果你的数据如下所示,并且你想把空值(也就是没有值的地方)替换成某个特殊字符,你可以这样做。
np.nan
在Python中就是表示空值的意思。
import pandas as pd
import numpy as np
data = [
[['A','B'], ['A','C'], ['D',np.nan]],
[[np.nan,'xx'], ['zz','xx'], ['zz','yy']],
[[1,2], [3,4],[2,2]]
]
df = pd.DataFrame(data)
special_char = 'NaN'
def replace_null(x):
if isinstance(x, list):
return [replace_null(item) for item in x]
else:
return x if not pd.isna(x) else special_char
df = df.applymap(replace_null)
print(df)