2016-06-05 3 views
2

Учитывая этот кадр данных:Извлечение номера из изменяемых Строка

import pandas as pd 

df = pd.DataFrame({'ID':['a','b','c','d','e','f','g','h','i','j','k'], 
        'value':['None',np.nan,'6D','7','10D','NONE','x','10D aaa','1 D','10 D aa',7] 
        }) 
df 


    ID value 
0 a None 
1 b NaN 
2 c 6D 
3 d 7 
4 e 10D 
5 f NONE 
6 g x 
7 h 10D aaa 
8 i 1 D 
9 j 10 D aa 
10 k i7D 

Я хотел бы, чтобы извлечь номера, где присутствует, иначе возвращает 0, для любого беспорядка ситуаций, как показано выше.

Желаемый результат:

ID value 
0 a 0 
1 b 0 
2 c 6 
3 d 7 
4 e 10 
5 f 0 
6 g 0 
7 h 10 
8 i 1 
9 j 10 
10 k 7 

Заранее спасибо!

+1

я хотел бы сделать это так: 'pd.to_numeric (df.value.str.replace (г '\ D +', ''), ошибки =» принуждать '). fillna (0) .astype (INT) ' – MaxU

ответ

1

Вот мой подход с использованием re.findall и apply

df['value'].apply(lambda x: 0 if not re.findall('\d+', str(x)) else re.findall('\d+', str(x))[0]) 
1

В качестве альтернативы, вы можете применить функцию к dataframe через applymap() после EAFP principle ловли несколько исключений при извлечении цифр:

def get_number(item): 
    try: 
     return int(re.search(r"\d+", str(item)).group(0)) 
    except (AttributeError, ValueError, IndexError): 
     return 0 

print(df.applymap(get_number)) 

Печатает:

ID value 
0 0  0 
1 0  0 
2 0  6 
3 0  7 
4 0  10 
5 0  0 
6 0  0 
7 0  10 
8 0  1 
9 0  10 
10 0  7 
1

Попробуйте следующее с помощью Series.str.replace и fillna :

import pandas as pd 

df = pd.DataFrame({'ID':['a','b','c','d','e','f','g','h','i','j','k'], 
        'value':['None',np.nan,'6D','7','10D','NONE','x','10D aaa','1 D','10 D aa',7] 
        }) 

df = df.fillna(0) 
df = df.str.replace(r'\D+', '').astype(int) 
Смежные вопросы