Python: условное разделение в столбце на основе наличия определенного символа

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

Я думаю, это сработает. Проверка была бы необходима, как если бы ‘.’ не было в строке, тогда срез выдаст исключение.