Zero padding pandas column - PullRequest
0 голосов
/ 04 июня 2019

У меня есть следующий фрейм данных, в котором col_1 имеет тип integer:

print(df)

col_1 
100
200
00153
00164

Я бы хотел добавить два нуля, если количество цифр равно 3:

final_col
00100
00200
00153
00164

Я пытался с:

df.col_1 = df.col_1.astype(int).astype(str)

df["final_col"] = np.where(len(df["col_1"]) == 3, "00" + df.col_1, df.col_1 )

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

Как я могу решить это?

Ответы [ 3 ]

4 голосов
/ 04 июня 2019

Другой способ использования series.str.pad():

df.col_1.astype(str).str.pad(5,fillchar='0')

0    00100
1    00200
2    00153
3    00164

Ваше решение должно быть обновлено до:

(np.where(df["col_1"].astype(str).str.len()==3, 
       "00" + df["col_1"].astype(str),df["col_1"].astype(str)))

Но это не будет работать, если длина строки меньше 5 и не равна 3, поэтому я рекомендую вам не использовать это.

4 голосов
/ 04 июня 2019

Использование str.zfill:

df['final_col'] = df['col_1'].astype(str).str.zfill(5)

[вне]

   final_col
0      00100
1      00200
2      00153
3      00164

Обновите, если вы хотите добавить только там, где len равно 3, используйте Series.where Спасибо @yatu за указание :

df.col_1.where(df.col_1.str.len().ne(3),
               df.col_1.astype(str).str.zfill(5))
1 голос
/ 04 июня 2019
# after converting it to str , you can foolow up list comprehension.

df=pd.DataFrame({'col':['100','200','00153','00164']})
df['col_up']=['00'+x if len(x)==3 else x for x in df.col ]
df

###output

    col    col_up
0   100     00100
1   200     00200
2   00153   00153
3   00164   00164


    ### based on the responses in comments 
  %%timeit -n 10000
 df.col.str.pad(5,fillchar='0') 
142 µs ± 5.47 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)


     %%timeit -n 10000
 ['00'+x if len(x)==3 else x for x in df.col ]
21.1 µs ± 952 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

  %%timeit -n 10000
  df.col.astype(str).str.pad(5,fillchar='0')
243 µs ± 7.02 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...