Разделите данные на отдельные столбцы, а затем объедините их в один столбец

Я новичок в Python, и мне нужны рекомендации о том, как разделить столбец, в котором данные разделены знаком «;»

Пример данных:

EMP_ID
1111909;ZMLed1;U937300;ZMLed2;
1281954;CMkzie;U028915;Z45134;QCPUY987;;C005528;QCP2155Q
1471999;U017735;WR01Cook;QCPUK783;

Как я могу разделить EMP_ID на отдельные столбцы, а затем объединить их обратно в один столбец, например

EMP_ID
1111909
ZMLed1
U937300
ZMLed2
1281954
CMkzie
U028915
Z45134
QCPUY987
C005528
QCP2155Q
1471999
U017735
WR01Cook
QCPUK783

Я пытался:

df = pd.read_sql("SELECT DISTINCT EMP_ID FROM TABLE", conn)


df[
    ['EMP_ID_1', 'EMP_ID_2', 'EMP_ID_3', 'EMP_ID_4', 'EMP_ID_5',
     'EMP_ID_6', 'EMP_ID_7']
] = df['EMP_ID'].str.split(';', expand=True)

тоже пробовал,

S = df.split(";")

Почему вы хотите разбить его на отдельные столбцы? Если это всего лишь средство достижения конечного результата, вам не нужно этого делать. Думаю, вы не знали о .explode(), да?

wjandrea 03.05.2024 22:05

Кстати, добро пожаловать в Stack Overflow! Если вам нужны советы, посмотрите тур и Как спросить.

wjandrea 03.05.2024 22:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
88
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

используйте explode после str.split

out = df['EMP_ID'].str.split(';').explode()

вне:

0     1111909
0      ZMLed1
0     U937300
0      ZMLed2
0            
1     1281954
1      CMkzie
1     U028915
1      Z45134
1    QCPUY987
1            
1     C005528
1    QCP2155Q
2     1471999
2     U017735
2    WR01Cook
2    QCPUK783
2            
Name: EMP_ID, dtype: object

создать пример

import pandas as pd
data = {'EMP_ID': ['1111909;ZMLed1;U937300;ZMLed2;', 
                   '1281954;CMkzie;U028915;Z45134;QCPUY987;;C005528;QCP2155Q', 
                   '1471999;U017735;WR01Cook;QCPUK783;']
       }
df = pd.DataFrame(data)

Обновлять

новый пример

import pandas as pd
data = {'colA': ['a;b;c', 'd;e'], 'colB': ['f', 'g']}
df = pd.DataFrame(data)

дф:

    colA    colB
0   a;b;c   f
1   d;e     g

редактировать столбец и развернуть

out = df.assign(colA=df['colA'].str.split(';')).explode('colA')

вне

    colA    colB
0   a       f
0   b       f
0   c       f
1   d       g
1   e       g

получаю эту ошибку: ValueError: должны иметь равные ключи и значения длины при настройке с помощью итерации

Animesh Jain 03.05.2024 21:50

@AnimeshJain Этот код не должен этого делать. Как вы его используете?

wjandrea 03.05.2024 22:08

@AnimeshJain Я прикрепил код для создания вашего примера, поэтому запустите код из приведенного выше примера, чтобы увидеть, генерирует ли он ошибку, и прокомментируйте.

Panda Kim 03.05.2024 22:11

в основном я извлекаю несколько столбцов из таблицы, например df = pd.read_sql("SELECT DISTINCT EMP_ID, Name, sup_name, man_name FROM TABLE", conn), а затем использую только что предоставленный вами код, получая результаты, но как я могу его изменить вытащить остальные столбцы также и для каждой из этих отдельных строк?

Animesh Jain 03.05.2024 22:31

Основываясь на вашем коде, который вы опубликовали в своем вопросе, я считаю, что вам нужно:

df_out = df["EMP_ID"].str.split(";").explode()
df_out = df_out[df_out != ""]
print(df_out.to_frame())

Распечатки:

     EMP_ID
0   1111909
0    ZMLed1
0   U937300
0    ZMLed2
1   1281954
1    CMkzie
1   U028915
1    Z45134
1  QCPUY987
1   C005528
1  QCP2155Q
2   1471999
2   U017735
2  WR01Cook
2  QCPUK783

Обновлено: Если вы хотите расшириться до столбцов:

df_out = df["EMP_ID"].str.split(";", expand=True)
df_out.columns = [f"EMP_ID_{c+1}" for c in df_out.columns]

print(df_out)

Распечатки:

  EMP_ID_1 EMP_ID_2  EMP_ID_3  EMP_ID_4  EMP_ID_5 EMP_ID_6 EMP_ID_7  EMP_ID_8
0  1111909   ZMLed1   U937300    ZMLed2               None     None      None
1  1281954   CMkzie   U028915    Z45134  QCPUY987           C005528  QCP2155Q
2  1471999  U017735  WR01Cook  QCPUK783               None     None      None
Ответ принят как подходящий

Одноэтапный подход может состоять в том, чтобы извлечь с помощью регулярного выражения, получая любую серию символов, которая не является ;:

out = df['EMP_ID'].str.extractall('([^;]+)')[0]

Выход:

   match
0  0         1111909
   1          ZMLed1
   2         U937300
   3          ZMLed2
1  0         1281954
   1          CMkzie
   2         U028915
   3          Z45134
   4        QCPUY987
   5         C005528
   6        QCP2155Q
2  0         1471999
   1         U017735
   2        WR01Cook
   3        QCPUK783
Name: 0, dtype: object

Как DataFrame:

df['EMP_ID'].str.extractall('(?P<EMP_ID>[^;]+)').droplevel('match')

Выход:

     EMP_ID
0   1111909
0    ZMLed1
0   U937300
0    ZMLed2
1   1281954
1    CMkzie
1   U028915
1    Z45134
1  QCPUY987
1   C005528
1  QCP2155Q
2   1471999
2   U017735
2  WR01Cook
2  QCPUK783

При необходимости вы также можете присоединить к исходному DataFrame.

Демонстрация регулярных выражений

Другие вопросы по теме