Поиск по ячейкам датафрейма Pandas
Люди добрые, помогите пожалуйста, хотя бы идеей, а то перепробовал все из мануалов, и не получается
Имеется датафрейм, в котором ячейки заполнены сложными цифровыми и буквенными данными. Необходимо извлечь по шаблону (например, \d{3,10}) последовательно из каждой ячейки список чисел и добавить их в новый датафрейм (или список), при этом желательно сохранить привязку к конкретной ячейке (номер ячейки + номер строки). Просто регулярные выражения почему-то не могу заставить работать в датафрейме.
Буду очень признателен любому совету.
UPD:
датафрейм примерно такой
df=pd.DataFrame({"number":[1, 2, 3, 4],
"products 1": ["3650482 Чай 3495758 3379939 3482097 3373028 3375442 3373024",
"4001101 Приправа 4001098 4001095 4001093 4001097 4001100",
"3428416 Фундук",
" " ],
"products 2": ["4106381 Напиток 4106382 4106380",
"4090345 Шоколад 4090347",
" ",
"108609 Майонез"],
"products 3": ["3273901 Соус соевый 3379232 ",
" ",
"4045462 Огурцы",
"12334 Апельсины"]})
Необходимо извлечь из столбцов products 1, products 2, products 3, только цифры артикулов, которых может и не быть в ячейке, а может и быть 5-8 шт.
получить:
№ Artikul Row Line
1 3650482 products1 1
2 4001097 products1 2
3 4001100 products1 2
4 12334 products3 4
......
Ответы (2 шт):
Можно так попробовать
def numeric_split(x):
return [i for i in x.split() if i.isnumeric()]
# Берем только цифры из строки
cols = ['products1', 'products2', 'products3']
# применяем к нашим столбцам
df[cols] = df[cols].applymap(numeric_split)
df.index = df.index + 1 # чтобы нумерация столбца Line была не с 0, а с 1
new_df = df[cols].stack().explode().dropna().reset_index().rename(columns={'level_0': 'Line', 'level_1': 'Row',
0: 'Article'})
>>> print(new_df)
Line Row Article
0 1 products1 3650482
1 1 products1 3495758
2 1 products1 3379939
3 1 products1 3482097
4 1 products1 3373028
5 1 products1 3375442
6 1 products1 3373024
.....
Можно ли искать в строке с помощью регулярного выражения числа или хотя бы ограничить количество цифр в числе больше 4 (от 1000 и более)
попробуйте примерно такой код (в примере числа ограничены 7 символами):
rows = [r.str.extractall('(?P<Article>\d{7,})').assign(Line=i) for i,r in df.set_index('number').iterrows()]
res = pd.concat(rows).droplevel(-1).rename_axis('Row').reset_index()
print(res)
'''
Row Article Line
0 products 1 3650482 1
1 products 1 3495758 1
2 products 1 3379939 1
3 products 1 3482097 1
4 products 1 3373028 1
5 products 1 3375442 1
6 products 1 3373024 1
7 products 2 4106381 1
8 products 2 4106382 1
9 products 2 4106380 1
10 products 3 3273901 1
11 products 3 3379232 1
12 products 1 4001101 2
13 products 1 4001098 2
14 products 1 4001095 2
15 products 1 4001093 2
16 products 1 4001097 2
17 products 1 4001100 2
18 products 2 4090345 2
19 products 2 4090347 2
20 products 1 3428416 3
21 products 3 4045462 3