Есть ли способ отформатировать почтовый индекс в pandas с использованием начальных 00

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

У меня есть DF со столбцом, посвященным почтовым индексам. Все почтовые индексы перепутаны, и я хочу очистить столбец, чтобы все почтовые индексы были в правильном 5-значном формате.

 df1 =

    ZIP CODE  
0    35481  
1    45481  
2    881 
3    4074
4    8831-1591
 

Я бы хотел, чтобы они были отформатированы следующим образом:

     ZIP CODE  
0    35481  
1    45481  
2    08810 
3    04074
4    08831

 

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

Вот что я написал:

 def fix_zip(series):
      return series.astype(str).str.replace('[^ws]', '').str.zfill(5)
 

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

Так, например, я получу 40740 вместо 04074

Спасибо, что посмотрели!

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

1. 881 -> 08810 разве это не должно быть 00881 ?

Ответ №1:

Вы можете получить первые последовательные цифры с помощью extract :

 def fix_zip(series):
      return series.astype(str).str.extract('(d )', expand=False).str.zfill(5)

df['new'] = fix_zip(df['ZIP CODE'])
print (df)
   ZIP CODE    new
0      35481  35481
1      45481  45481
2        881  00881
3       4074  04074
4  8831-1591  08831
 

Или с разделением, как:

 def fix_zip(series):
      return series.astype(str).str.split('-').str[0].str.zfill(5)
 

Если требуется обработка значений с длиной другим способом, здесь добавьте по одному 0 до и 0 после:

 def fix_zip(series):
      s =  series.astype(str).str.extract('(d )', expand=False)
      return s.str.zfill(5).mask(s.str.len().eq(3), '0'   s   '0')

df['new'] = fix_zip(df['ZIP CODE'])
print (df)
    ZIP CODE    new
0      35481  35481
1      45481  45481
2        881  08810
3       4074  04074
4  8831-1591  08831
 

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

1. но операционный код также должен ставить ‘0’ на первую позицию, не так ли?

2. @BrownBear — Как ты думаешь 881 ?

3. Его код дает мне 00881 , и 04074 , конечно, в нем есть логические ошибки для последнего значения `8831-1591`, но ответ был I cant get it to get the zip codes to start with '0's instead it puts the 0s on the end. So for example Ill get 40740 instead of 04074

4. @BrownBear — да, я не могу имитировать get 40740 instead of 04074 . Но причина должна быть в том, что данные нравятся 4074-0909 — тогда получите с помощью решения OP 40740

5. да, это должно было быть 00881, но спасибо и за другое решение!