Как найти число в столбце df со смесью данных, используя регулярное выражение в pandas

#python #pandas

#python #pandas

Вопрос:

знаете ли вы, как преобразовать этот код, чтобы получить более быстрый? В этом коде я хотел бы взять только число (десятичное или целое число) и отклонить слова, присутствующие в столбце. на самом деле, в столбце a я могу найти как число, так и слова. Спасибо!

  a=['a', '9','4.5','nnn', '3.4543', '2'] c=[1,10,5,4,4,7] 

df=pd.DataFrame(a,c) 
b =pd.Series(np.zeros(len(df)), name='b', index=df.index)    
    i = 0
for row in df.a:  
    if re.findall(r'(d [.]d )', str(row)):
        b.loc[i] = re.search(r'(d [.]d )', str(row)).group()
        
    elif re.findall(r'(bd b)', str(row)):  
        b.loc[i] = re.search(r'(bd b)', str(row)).group()

    else: 
        b.loc[i] = '9999'
    
    i = i   1

for i in range(len(b)):
    b.loc[i]=float(b.loc[i])
    
df.a = b
  

Я хотел бы получить=[9999, 9, 4.5,9999,3.4543, 2]

Комментарии:

1. если вы покажете образец своих данных с предполагаемым выводом, мы можем помочь с решением.

2. вот так: a= [‘a’, ‘9’,’4.5′,’ ннн’, ‘3.4543’, ‘2’] c=[1,10,5,4,4,7] df=pd.DataFrame(a,c) Я хотел бы получить a=[9999, 9, 4.5,9999,3.4543, 2]

3. пожалуйста, добавьте его в свой основной пост

Ответ №1:

Используйте функции apply и assign для создания нового столбца:

импорт re

 regnumber = re.compile(r'd (?:,d*)?')

a=['a', '9','4.5','nnn', '3.4543', '2'] 
c=[1,10,5,4,4,7] 

df=pd.DataFrame({'a':a,'c':c}) 

df = df.assign(
    a = lambda x: x['a'].apply(lambda s: s if regnumber.match(s) else 9999)
)
print(df)

      a   c

   9999   1
      9  10 
    4.5   5
   9999   4
 3.4543   4
      2   7