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