Python + Regex + CSV + Pandas: не удалось получить числовые значения из буквенно-цифровых значений - PullRequest
0 голосов
/ 26 марта 2019

Я получаю данные из многолистового файла xlsx и храню данные в отдельных файлах csv.Первые строки всех листов в xslx сохраняются в первом csv, вторые строки всех листов сохраняются во втором csv и т. Д.Теперь иногда любая из ячеек с 3-го по 10-й столбец содержит буквенно-цифровые значения, такие как «1 pkt».Мне нужно сделать эти значения только числовыми, например, «1», чтобы я мог передать эти значения в модель ML, чтобы что-то предсказать.Для этого я написал код:

xls = xlrd.open_workbook(r'Smallys ORDER.xlsx', on_demand=True)
df_list = []

names = xls.sheet_names()
names.remove('EVENT')

for i in range(191):
    rows = []
    for name in names:
        count = 0
        prod = pd.read_excel('Smallys ORDER.xlsx', name, index_col=None, header=0)
        prod['date'] = name
        prod.fillna(0, inplace=True)
        try:
            item = prod.iloc[i]
            item[3] = re.split('[a-z]+', item[3])[0]
            print(item[3])
            '''item[4] = item[4].split(sep, 1)[0]
            item[5] = item[5].split(sep, 1)[0]
            item[6] = item[6].split(sep, 1)[0]
            item[7] = item[7].split(sep, 1)[0]
            item[8] = item[8].split(sep, 1)[0]
            item[9] = item[9].split(sep, 1)[0]
            item[10] = item[10].split(sep, 1)[0]'''


            rows.append(item)

        except:
            print('Row finished !!!')


    writer = csv.writer(open('/home/hp/products/' + 'prod['+str(i)+'].csv', 'w')) 
    writer.writerow(prod.columns.tolist())
    writer.writerows(rows)    

print(item[3]) оператор ничего не печатает.Кроме того, в сгенерированных CSV-файлах печатались только заголовки.Все ячейки пусты.

Редактировать:

Перед применением любого регулярного выражения это:

item = prod.iloc[i]
print(item[3])
print(type(item[3]))

печатает это:

0
<class 'int'>
0
<class 'int'>
0
<class 'int'>
0
<class 'int'>
0
<class 'int'>
0
<class 'int'>
0
<class 'int'>
1 btl
<class 'str'>
0
<class 'int'>

Таким образом, значения являются целыми числами или строками.

Пример данных из листа исходного файла xlsx:

enter image description here

1 Ответ

1 голос
/ 26 марта 2019

Поскольку вы хотите изменить любой текст, например 1 pkt на 1, вместо разделения с помощью [a-z]+, лучше заменить и изменить эту строку:

item[3] = re.split('[a-z]+', item[3])[0]

на:

item[3] = re.sub(r'\D*', '', str(item[3]))

, который заменит любые нецифровые символы на пустую строку.

Дайте мне знать, если это работает.Если нет, можете ли вы напечатать значение item[3] и показать, что оно печатает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...