Как вы удаляете только целые числа столбца в пандах? - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь вырезать только числовые значения - первые 1 или 2 цифры.Некоторые значения в столбце содержат чистые строки, а другие содержат специальные символы.См. Рис. Для подсчета значений:

введите описание изображения здесь

Я пробовал несколько методов:

breaks['_Size'] = breaks['Size'].fillna(0)
breaks[breaks['_Size'].astype(str).str.isdigit()]
breaks['_Size'] = breaks['_Size'].replace('\*','',regex=True).astype(float)
breaks['_Size'] = breaks['_Size'].str.extract('(\d+)').astype(int)
breaks['_Size'].map(lambda x: x.rstrip('aAbBcC'))

Ни один не работает.Dtype это объект.Чтобы было ясно, я пытаюсь создать новый столбец только с цифрами (как int / float), и если бы я мог преобразовать дробь в десятичную, что было бы бонусом

1 Ответ

1 голос
/ 27 сентября 2019

Это работает для деления дробей, а также позволяет присутствовать дополнительным числам в строке (возвращает только первую последовательность чисел):

In [60]: import pandas as pd                                                                                                                                                                                  

In [61]: import re                                                                                                                                                                                            

In [62]: df = pd.DataFrame([0, "6''", '7"', '8in', 'text', '3/4"', '1a3'], columns=['_Size'])                                                                                                                 

In [63]: df                                                                                                                                                                                                   
Out[63]: 
  _Size
0     0
1   6''
2    7"
3   8in
4  text
5  3/4"
6   1a3

In [64]: def cleaning_function(row): 
    ...:     row = str(row) 
    ...:     fractions = re.findall(r'(\d+)/(\d+)', row) 
    ...:     if fractions: 
    ...:         return float(int(fractions[0][0])/int(fractions[0][1])) 
    ...:     numbers = re.findall(r'[0-9]+', str(row)) 
    ...:     if numbers: 
    ...:         return numbers[0] 
    ...:     return 0 
    ...:                                                                                                                                                                                                      

In [65]: df._Size.apply(cleaning_function)                                                                                                                                                                    
Out[65]: 
0       0
1       6
2       7
3       8
4       0
5    0.75
6       1
Name: _Size, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...