Создайте новые строки в Pandas Dataframe из таких ячеек, как «BCD 1-5».

avatar
JaW
1 июля 2021 в 16:45
49
2
0

У меня есть CSV-файл, содержащий информацию о товарных запасах. В настоящее время некоторые продукты перечислены в виде групп по пять, например «BCD 1–5», «BCD 6–10» и т. д. Мне нужно превратить эти группы в 5 строк, чтобы каждая строка находилась в формат «BCD 1», «BCD 2», «BCD 3» и т. д. Я думаю, что мне нужно будет использовать кучу разных регулярных выражений, чтобы найти «1-5», «6- 10" и создайте из него новые строки, но я немного застрял в начале работы.

df = pd.DataFrame([{'var1': 'a', 'var2': '1-5'},
           {'var1': 'b', 'var2': '6-10'}])

Отсюда:

|Name|Inventory Number|
|:---|---:|
|x|A BCD 1-5|
|x|A BCD 6-10|

К этому:

|Name|Inventory Number|
|:---|---:|
|x|A BCD 1|
|x|A BCD 2|
|x|A BCD 3|
|x|A BCD 4|
|x|A BCD 5|
|x|A BCD 6|
|x|A BCD 7|
|x|A BCD 8|
|x|A BCD 9|
|x|A BCD 10|
Источник
Camilo Martinez M.
1 июля 2021 в 16:50
0

Насколько велик ваш CSV?

JaW
1 июля 2021 в 17:06
0

Около 15000 строк

Ответы (2)

avatar
Corralien
1 июля 2021 в 17:03
1

Другой способ:

>>>  df['Inventory Number'].str.extract(r'(.*) (\d+)-(\d+)') \
                           .dropna(how='all') \
                           .apply(lambda x: [f'{x[0]} {i}'
                                      for i in np.arange(int(x[1]), int(x[2])+1)],
                                  axis='columns').explode()

0     A BCD 1
0     A BCD 2
0     A BCD 3
0     A BCD 4
0     A BCD 5
1     A BCD 6
1     A BCD 7
1     A BCD 8
1     A BCD 9
1    A BCD 10
dtype: object
avatar
Nk03
1 июля 2021 в 16:55
1

Вот так:

df[['Inventory Name', 'var2']] = df.pop(
    'Inventory Number').str.rsplit(' ', n=1, expand=True)
df = df.assign(var2=df.var2.str.split(
    '-').apply(lambda x: np.arange(int(x[0]), int(x[1])+1))).explode('var2')
df = df.astype(str).set_index('Name').agg(
    ' '.join, 1).reset_index(name='Inventory Number')