【问题标题】:Python - An UDF to change the data types and replace values of a Pandas DataFramePython - 用于更改数据类型和替换 Pandas DataFrame 值的 UDF
【发布时间】:2019-02-06 03:44:51
【问题描述】:

我正在尝试编写一个用户定义的函数来查看输入列数据类型并对其进行更改。

我的输入数据类型将是 int64、float64、object、datetimens[64]。

如果它是 datetimens[64],那么我将用另一个自定义日期替换空白日期。输出数据类型也将是 datetimens[64]

如果它是 int64、float64 或对象。我用“FILLINGTHENAS”替换空格 - 一个字符串并将所有这些数据类型转换为对象。

def Change_Data_Type_DataFrame (AnyPandasDataFrame):
    cr_date = datetime(1800,1,1,1,1,1)        
    for i in range(1, AnyPandasDataFrame.shape[1]):
        Required_Column_Name = (AnyPandasDataFrame.columns[i])
        Required_Data_Type = AnyPandasDataFrame[Required_Column_Name].dtype                                       
        if Required_Data_Type == 'datetime64[ns]':
            DateChecker = True
        else:
            DateChecker = contains_word(Required_Column_Name, "Date","of Death","Day of Work") 
        if DateChecker == False :
            if Required_Data_Type == 'int64':
                print("Yes")
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].fillna("FILLINGTHENAS")
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str)
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str).replace('\.0', '', regex=True)
            if Required_Data_Type == object:
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].fillna("FILLINGTHENAS")
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str)
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str).replace('\.0', '', regex=True)
            if Required_Data_Type == 'float64':
                    AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].fillna("FILLINGTHENAS")
                    AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str)
                    AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str).replace('\.0', '', regex=True)         
        else:
            AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].fillna(cr_date)
            AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype('datetime64[ns]')  
    return (AnyPandasDataFrame)

我有一个包含 100 列的巨大数据框,我的函数失败了,因为我可以在输出数据框中看到 int64。

print - yes 不起作用,但我的 df 肯定有 int64 dtypes。

我哪里错了,我的代码能不能写得更好。

请帮我解决这个问题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我对代码进行了以下更改。

    范围从 1 开始,我让它从 0 开始

    我删除了多个 if 并将其作为一个单独的 if 逻辑

    我再次替换后重新设置了数据类型,只是为了确保“Pandas 没有重新设置它”。

    def Change_Data_Type_DataFrame (AnyPandasDataFrame):
    
    cr_date = datetime(1800,1,1,1,1,1)        
    for i in range(0, AnyPandasDataFrame.shape[1]):
        Required_Column_Name = (AnyPandasDataFrame.columns[i])
        print(Required_Column_Name)
        Required_Data_Type = AnyPandasDataFrame[Required_Column_Name].dtype                                       
        if Required_Data_Type == 'datetime64[ns]':
            DateChecker = True
        else:
            DateChecker = contains_word(Required_Column_Name, "Date","of Death","Day of Work") 
        if DateChecker == False :
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].fillna("FILLINGTHENAS")
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str).replace('\.0', '', regex=True)
                AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype(str)
        else:
            AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].fillna(cr_date)
            AnyPandasDataFrame[Required_Column_Name] = AnyPandasDataFrame[Required_Column_Name].astype('datetime64[ns]')  
    return (AnyPandasDataFrame)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多