#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
— тогда получите с помощью решения OP40740
5. да, это должно было быть 00881, но спасибо и за другое решение!