爆炸Pandas数据框,处理元素数量不匹配

0 投票
2 回答
33 浏览
提问于 2025-04-13 13:26

我在处理一个这样的数据集,想要把每个列表里的内容拆分开来。

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)

撰写回答