как разбить строку в одном столбце на новые столбцы для каждого символа в пандах - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть pandas кадр данных, который выглядит следующим образом:

                flag
0        NNxxNxNNxNN
1        xxNNNNNNNNN
2        xxxNNxNNNNN
3        xxxxNxxxxxN
4        xxxxxxNxxxx
5        xxxxxxxNxNN

И я хотел бы разбить строку на новый столбец для каждого символа, например, так:

         col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11
0        N    N    x    x    N    x    N    N    x    N    N
1        x    x    N    N    N    N    N    N    N    N    N
2        x    x    x    N    N    x    N    N    N    N    N
3        x    x    x    x    N    x    x    x    x    x    N
4        x    x    x    x    x    x    N    x    x    x    x
5        x    x    x    x    x    x    x    N    x    N    N

У моего dataframe есть несколько миллионов строк - есть ли эффективный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Использование tolist с pd.DataFrame

pd.DataFrame(df.flag.apply(list).tolist())
Out[905]: 
  0  1  2  3  4  5  6  7  8  9  10
0  N  N  x  x  N  x  N  N  x  N  N
1  x  x  N  N  N  N  N  N  N  N  N
2  x  x  x  N  N  x  N  N  N  N  N
3  x  x  x  x  N  x  x  x  x  x  N
4  x  x  x  x  x  x  N  x  x  x  x
5  x  x  x  x  x  x  x  N  x  N  N

И метод с extractall

df.flag.str.extractall('(.)')[0].unstack()
Out[931]: 
match 0  1  2  3  4  5  6  7  8  9  10
0      N  N  x  x  N  x  N  N  x  N  N
1      x  x  N  N  N  N  N  N  N  N  N
2      x  x  x  N  N  x  N  N  N  N  N
3      x  x  x  x  N  x  x  x  x  x  N
4      x  x  x  x  x  x  N  x  x  x  x
5      x  x  x  x  x  x  x  N  x  N  N
0 голосов
/ 20 сентября 2018

Вы можете сделать:

new_df = pd.DataFrame(np.stack(df.flag.apply(list).values))
>>> new_df
  0  1  2  3  4  5  6  7  8  9  10
0  N  N  x  x  N  x  N  N  x  N  N
1  x  x  N  N  N  N  N  N  N  N  N
2  x  x  x  N  N  x  N  N  N  N  N
3  x  x  x  x  N  x  x  x  x  x  N
4  x  x  x  x  x  x  N  x  x  x  x
5  x  x  x  x  x  x  x  N  x  N  N

Или

new_df = df.flag.apply(lambda x: pd.Series(list(x)))
>>> new_df
  0  1  2  3  4  5  6  7  8  9  10
0  N  N  x  x  N  x  N  N  x  N  N
1  x  x  N  N  N  N  N  N  N  N  N
2  x  x  x  N  N  x  N  N  N  N  N
3  x  x  x  x  N  x  x  x  x  x  N
4  x  x  x  x  x  x  N  x  x  x  x
5  x  x  x  x  x  x  x  N  x  N  N

Чтобы получить имена столбцов, просто добавьте add_prefix к любому из указанных выше вызовов:

new_df = df.flag.apply(lambda x: pd.Series(list(x))).add_prefix('col_')
>>> new_df
  col_0 col_1 col_2 col_3 col_4 col_5 col_6 col_7 col_8 col_9 col_10
0     N     N     x     x     N     x     N     N     x     N      N
1     x     x     N     N     N     N     N     N     N     N      N
2     x     x     x     N     N     x     N     N     N     N      N
3     x     x     x     x     N     x     x     x     x     x      N
4     x     x     x     x     x     x     N     x     x     x      x
5     x     x     x     x     x     x     x     N     x     N      N
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...