Создайте строки, эквивалентные количеству полей идентификаторов в определенном столбце в pandas

#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