Я новичок в 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(";")
Кстати, добро пожаловать в Stack Overflow! Если вам нужны советы, посмотрите тур и Как спросить.
используйте 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: должны иметь равные ключи и значения длины при настройке с помощью итерации
@AnimeshJain Этот код не должен этого делать. Как вы его используете?
@AnimeshJain Я прикрепил код для создания вашего примера, поэтому запустите код из приведенного выше примера, чтобы увидеть, генерирует ли он ошибку, и прокомментируйте.
в основном я извлекаю несколько столбцов из таблицы, например df = pd.read_sql("SELECT DISTINCT EMP_ID, Name, sup_name, man_name FROM TABLE", conn), а затем использую только что предоставленный вами код, получая результаты, но как я могу его изменить вытащить остальные столбцы также и для каждой из этих отдельных строк?
Основываясь на вашем коде, который вы опубликовали в своем вопросе, я считаю, что вам нужно:
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.
Почему вы хотите разбить его на отдельные столбцы? Если это всего лишь средство достижения конечного результата, вам не нужно этого делать. Думаю, вы не знали о
.explode()
, да?