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

#python #pandas

Вопрос:

У меня есть 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|
 

Комментарии:

1. Насколько велик ваш csv-файл?

2. Около 15000 строк

Ответ №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
 

Ответ №2:

Вот один из способов:

 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')