Разбить столбец списков на несколько столбцов - PullRequest
0 голосов
/ 10 мая 2018

У меня есть серия панд, которая содержит массив для каждого элемента, например:

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 голосов
/ 10 мая 2018

Дело 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 строк, используйте: </p>

df['col'] = pd.eval(df['col'])

А затем реализовать вариант 1. В противном случае используйте ast:

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

И действуй как прежде.

0 голосов
/ 10 мая 2018

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
0 голосов
/ 10 мая 2018

Одним из решений является использование pd.DataFrame.apply с pd.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...