将列列拆分为多列

时间:2018-05-10 02:39:50

标签: python list pandas dataframe

我有一个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]

我想提取所有第一个元素,将它们放在另一个系列或列表中,并对第二个元素执行相同的操作。 我试过做正则表达式:

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

并分裂:

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

都提供nan值。我做错了什么?

3 个答案:

答案 0 :(得分: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'])

然后实现案例1.否则,使用ast

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

继续像往常一样。

答案 1 :(得分: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 :(得分:1)

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