将列表列拆分为多个列

5

我有一个包含每个元素数组的Pandas系列,如下所示:

0            [0, 0]
1          [12, 15]
2          [43, 45]
3           [9, 10]
4            [0, 0]
5            [3, 3]
6            [0, 0]
7            [0, 0]
8            [0, 0]
9            [3, 3]
10           [2, 2]

我希望提取所有的第一个元素,将它们放入另一个Series或列表中,并对第二个元素执行相同操作。我尝试使用正则表达式:

mySeries.str.extract(r'\[(\d+), (\d+)\]', expand=True)

还有拆分:

mySeries.str.split(', ').tolist())

两者都会给出“NaN”值。我做错了什么?
3个回答

3

案例1
列表列
您需要将该列转换为.tolist,并将其加载到DataFrame中。

pd.DataFrame(df['col'].tolist())

df
         col
0     [0, 0]
1   [12, 15]
2   [43, 15]
3    [9, 10]
4     [0, 0]
5     [3, 3]
6     [0, 0]
7     [0, 0]
8     [0, 0]
9     [3, 3]
10    [2, 2]

pd.DataFrame(df['col'].tolist())

     0   1
0    0   0
1   12  15
2   43  15
3    9  10
4    0   0
5    3   3
6    0   0
7    0   0
8    0   0
9    3   3
10   2   2

注意:如果您的数据中包含NaN,我建议先删除它们:df = df.dropna(),然后按照上面所示的步骤继续操作。
案例2
以列表形式表示的字符串列
如果您的行数小于100,请使用:
df['col'] = pd.eval(df['col'])

然后实现case 1。否则使用ast

import ast
df['col'] = df['col'].apply(ast.literal_eval)

并照之前的方式继续进行。

2
一种解决方案是使用 pd.DataFrame.applypd.Series。这假定你有一系列列表,如你的问题所示,而不是字符串。
如果你使用的是一系列列表,那么你的逻辑将无法工作,因为在 pandas 中它们并不表示为字符串。
df = pd.DataFrame({'A': [[1, 2], [3, 4], [5, 6]]})

df[['B', 'C']] = df['A'].apply(pd.Series)

print(df)

        A  B  C
0  [1, 2]  1  2
1  [3, 4]  3  4
2  [5, 6]  5  6

2
应该注意到,在性能方面,apply + Series 是一对地狱般的组合。这是 OP 的头疼问题,但对我来说影响不大 :p - cs95

2

zip函数用于将df.col中的元素进行压缩。

df.assign(**dict(zip('AB', zip(*df.col))))

         col   A   B
0     [0, 0]   0   0
1   [12, 15]  12  15
2   [43, 45]  43  45
3    [9, 10]   9  10
4     [0, 0]   0   0
5     [3, 3]   3   3
6     [0, 0]   0   0
7     [0, 0]   0   0
8     [0, 0]   0   0
9     [3, 3]   3   3
10    [2, 2]   2   2

或者

df['A'], df['B'] = zip(*df.col)
df

         col   A   B
0     [0, 0]   0   0
1   [12, 15]  12  15
2   [43, 45]  43  45
3    [9, 10]   9  10
4     [0, 0]   0   0
5     [3, 3]   3   3
6     [0, 0]   0   0
7     [0, 0]   0   0
8     [0, 0]   0   0
9     [3, 3]   3   3
10    [2, 2]   2   2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接