【问题标题】:Padding zeroes to columns with NaN values将零填充到具有 NaN 值的列
【发布时间】:2021-11-17 06:00:38
【问题描述】:

我有一个 pandas 数据框,其中三列是浮点数(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),但他们没有像我预期的那样添加零。如果比我更有知识的人能帮助我,我将不胜感激!

【问题讨论】:

    标签: python pandas nan leading-zero zero-padding


    【解决方案1】:

    您将数字作为浮点数,首先将它们转换为 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
    

    【讨论】:

      【解决方案2】:

      如果您的列中只有 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)                                                              
      

      【讨论】:

        【解决方案3】:

        我们可以利用索引对齐,从Num3 中只选择notnull 的行,然后使用astype 转换为int,然后将map 转换为格式字符串:

        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]
        })
        

        【讨论】:

          猜你喜欢
          • 2020-05-14
          • 2021-03-11
          • 1970-01-01
          • 1970-01-01
          • 2019-03-21
          • 2017-04-28
          • 1970-01-01
          • 1970-01-01
          • 2021-01-24
          相关资源
          最近更新 更多