0

我有一个熊猫数据框,其中三列是浮点数(floats64):

         Num1       Num2         Num3
0       2345656      3.0      12345.0
1          3456      3.0       3100.0
2        541304      4.0       5432.0      
3           NaN      NaN          NaN        
4   12313201308      1.0      99999.0 

我想在 Num2 和 Num3 列中添加前导零,使它们看起来像这样:

         Num1       Num2         Num3
0       2345656      003        12345
1          3456      003        03100
2        541304      004        05432      
3           NaN      NaN          NaN        
4   12313201308      001        99999 

我希望 Num2 总共有 3 位数字,包括前导零,而 Num3 总共有 5 位数字,包括前导零,使 NaN 保持原样(或不影响 NaN)。最终目标是连接 Num1、Num2 和 Num3 以创建一个新列。

我尝试了 df['Num2'].apply(lambda x: '{:05}'.format(x) if pd.notnull(x) else x)df['Num2'].apply(lambda x: x.zfill(5) if pd.notnull(x) else x),但它们没有像我预期的那样添加零。如果比我更有知识的人可以帮助我,我将不胜感激!

4

3 回答 3

0

您将数字作为浮点数,首先将它们转换为 int:

df['Num2'] = df['Num2'].apply(lambda x: '{:03}'.format(int(x)) if pd.notnull(x) else x)
df['Num3'] = df['Num3'].apply(lambda x: '{:05}'.format(int(x)) if pd.notnull(x) else x)

df

           Num1 Num2   Num3
0  2.345656e+06  003  12345
1  3.456000e+03  003  03100
2  5.413040e+05  004  05432
3           NaN  NaN    NaN
4  1.231320e+10  001  99999
于 2021-09-23T21:00:02.337 回答
0

如果您的列中只有 NaN 值,您可以尝试:

import numpy as np
df['Num3'] = df['Num3'].apply(lambda x: '{0:0>5}'.format(int(x)) if not np.isnan(x) else np.nan)                                                              
于 2021-09-23T21:00:15.423 回答
0

我们可以利用索引对齐的优势,只选择Num3其中的行notnull,将其转换为int使用astypethenmap为格式字符串:

df['Num3'] = df.loc[df['Num3'].notna(), 'Num3'].astype(int).map('{:05d}'.format)

或者直接Series.map调用python的int

df['Num3'] = df.loc[df['Num3'].notna(), 'Num3'].map(lambda x: f'{int(x):05d}')

df

            Num1  Num2   Num3
0      2345656.0   3.0  12345
1         3456.0   3.0  03100
2       541304.0   4.0  05432
3            NaN   NaN    NaN
4  12313201308.0   1.0  99999

设置:

import pandas as pd
from numpy import nan

pd.set_option("precision", 10)

df = pd.DataFrame({
    'Num1': [2345656.0, 3456.0, 541304.0, nan, 12313201308.0],
    'Num2': [3.0, 3.0, 4.0, nan, 1.0],
    'Num3': [12345.0, 3100.0, 5432.0, nan, 99999.0]
})
于 2021-09-23T21:21:25.770 回答