#python
#python
Вопрос:
Я разработал процедуру, которая считывает файл .csv и загружает его в таблицу базы данных. Перед загрузкой в базу данных я преобразую все, кроме даты и времени, в строку. Ниже приведен фрагмент исходных данных (приведены только 3 столбца)
ID Mat_Code date
100 300.0 20.11.2019
101 400 30.01.2020
Я хочу удалить десятичную точку Mat_Code
и вставить df
в базу данных.
Я попробовал это:
for c,d in zip(df.columns,df.dtypes):
if 'float' in str[d]:
df[c] = df[c].astype(str).apply(lambda x : x[:-2])
Но этот код выдает следующее df
ID Mat_Code date
100 300 20.11.2019
101 4 30.01.2020 <----Note that the Mat_code has been changed!!
Я хочу разработать функцию, которая проверяла бы каждое Mat_Code
поле по строке, .
а затем выполняла rstrip
бы или аналогичную операцию.
Я не сторонник regex
, если это не нужно.
Комментарии:
1. Разве вы не можете просто сделать
astype(int)
? Или есть какое-то конкретное условие для этого?
Ответ №1:
один из способов заменить строки — использовать регулярное выражение.
df['col2'].astype(str).apply(lambda x:re.findall('.*(?=.)',x)[0])
или иначе
df['col2'].astype(str).apply(lambda x:re.findall('(.*).',x)[0])
Вот пример,
In [16]: df
Out[16]:
col11 col2
0 1 1.0
1 23 2.9
2 4 3.4
3 5 4.0
In [17]: df['col2'].astype(str).apply(lambda x:re.findall('.*(?=.)',x)[0])
Out[17]:
0 1
1 2
2 3
3 4
Хотя просто df['col2'].astype(int)
также даст вам тот же результат.
Комментарии:
1. Последняя строка хороша 👍 … надеюсь, в этом столбце нет кода, для которого требуется префикс ‘0’, например ‘0031’ или что-то в этом роде.
2. @Anurag : Спасибо.
df['col2'].astype(int)
не помогло бы, поскольку может быть0
префикс.
Ответ №2:
Будет ли это работать?
if '.' in df['col2'].astype(str): # or some kind of check here
df['col2'].astype(str).apply(lambda x:x[:x.index('.')],x)
Я думаю, это сработает. Проверка была бы необходима, как если бы ‘.’ не было в строке, тогда срез выдаст исключение.