#python #pandas #dataframe
Вопрос:
У меня есть подробный столбец в df, в котором может содержаться несколько сведений о клиентах, как в первой таблице ниже.
Если в подробном столбце содержится более одной информации о клиенте, мне нужно создать новую строку для каждого клиента, как во второй таблице.
Как я могу сделать это на Python?
Дата | время | потребитель | Подробные сведения |
---|---|---|---|
12/11 | 12:00 | азбука | ИДЕНТИФИКАТОР:123, Кол-во: 1,Имя: abcdef, ИДЕНТИФИКАТОР: 324,Кол-во:2,Имя: ghiefg, |
13/11 | 13:00 | защита | Идентификатор:123, Кол-во: 1,Имя: abcdef, |
14/11 | 11:00 | ghj | ИДЕНТИФИКАТОР:123, Кол-во: 1,Имя: abcdef, ИДЕНТИФИКАТОР:123, Кол-во: 1,Имя: abcdef, |
Дата | время | потребитель | Подробные сведения |
---|---|---|---|
12/11 | 12:00 | азбука | Идентификатор:123, Кол-во: 1,Имя: abcdef, |
12/11 | 12.00 | азбука | ID: 324,Кол-во:2,Имя: ghiefg |
13/11 | 13:00 | защита | Идентификатор:123, Кол-во: 1,Имя: abcdef, |
14/11 | 11:00 | ghj | Идентификатор:123, Кол-во: 1,Имя: abcdef, |
14/11 | 11:00 | hgf | Идентификатор:123, Кол-во: 1,Имя: abcdef, |
Комментарии:
1. примеры данных до и после создания новых строк не совпадают. Должны ли они совпадать, или я не вижу здесь закономерности.
Ответ №1:
Используйте регулярное выражение lookahead для split
строки, затем explode
оно:
df['details'] = df['details'].str.split(',s*(?=ID:)')
df.explode('details')
выход:
date time consumer details
0 12/11 12:00 abc ID:123, Qty: 1,Name: abcdef
0 12/11 12:00 abc ID: 324,Qty:2,Name: ghi
1 13/11 13:00 def ID:123, Qty: 1,Name: abcdef,
2 14/11 11:00 ghj ID:123, Qty: 1,Name: abcdef
2 14/11 11:00 ghj ID:123, Qty: 1,Name: abc
Ответ №2:
Предполагая, что для каждого клиента есть 3 поля (идентификатор, количество, имя), вы можете попробовать что-то подобное.
import pandas as pd
df = pd.DataFrame(
{
"date:": ["12/11", "13/11", "14/11"],
"time": ["12:00", "13:00", "11:00"],
"consumer": ["abc", "def", "ghj"],
"details": [
"ID:123, Qty: 1,Name: abcdef,ID: 324,Qty:2,Name: ghi",
"ID:123, Qty: 1,Name: abcdef",
"ID:123, Qty: 1,Name: abcdef,ID:123, Qty: 1,Name: abc",
],
}
)
df["details"] = df["details"].apply(
lambda txt: [
','.join(txt.split(",")[idx : idx 3]) for idx in range(0, len(txt.split(",")), 3)
]
)
df = df.explode("details").reset_index(drop=True)
print(df)
Sample Output
date: time consumer details
0 12/11 12:00 abc ID:123, Qty: 1,Name: abcdef
1 12/11 12:00 abc ID: 324,Qty:2,Name: ghi
2 13/11 13:00 def ID:123, Qty: 1,Name: abcdef
3 14/11 11:00 ghj ID:123, Qty: 1,Name: abcdef
4 14/11 11:00 ghj ID:123, Qty: 1,Name: abc