【问题标题】:Why doesn't this Python user-defined function do its task?为什么这个 Python 用户定义的函数不能完成它的任务?
【发布时间】:2021-10-07 22:01:05
【问题描述】:

我在 Python 中创建了这个函数来检查 DF 每一列的数据类型,并确保它成为它应该是的数据类型。

def dataType(df):

    '''This function makes sure the data type for all 7 columns of the final dataframe are correct'''

    #Day as date type

    df["Day"] = pd.to_datetime(df["Day"])

    df["Day"] = df["Day"].dt.strftime("%m/%d/%Y")

    #Channel, Partner as string type

    df[["Channel", "Partner"]] = df[["Channel", "Partner"]].astype(str)

    #Spend, Clicks, Impressions, Platform Conversions as float type

    df['Platform Conversions'] = df['Platform Conversions'].where(df['Platform Conversions'] == "null", 0)

    df[["Spend", "Clicks", "Impressions", "Platform Conversions"]] = df[["Spend", "Clicks", "Impressions", "Platform Conversions"]].astype(float)

    return df

我用这样的代码测试了每一列,但它们仍然输出说所有列都是对象类型。我做错了什么?

print(df["Day"].dtypes)

【问题讨论】:

  • 也许您可以尝试从头开始构建一个新的 df,一次添加一个列(将按其相应的类型进行分类)。
  • @MarkLavin,是的,这实际上就是我最初所做的。我正在尝试这样做(创建一个定义),因为它会节省至少 200 行代码。那么有没有办法创建所需的功能?

标签: python pandas types user-defined-functions


【解决方案1】:

查看文档:https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.strftime.html

df["Day"] = df["Day"].dt.strftime("%m/%d/%Y")

不返回日期时间对象。

我测试了dt.strftime函数(函数外,等效):

d = '''Day
01/01/2001
01/02/2001'''
df = pd.read_csv(StringIO(d))
df.dtypes

Day    object
dtype: object
df["Day"] = pd.to_datetime(df["Day"])
df.dtypes

Day    datetime64[ns]
dtype: object
df["Day"] = df["Day"].dt.strftime("%m/%d/%Y")
df.dtypes

Day    object
dtype: object

【讨论】:

  • @Claie 如果它回答了您的问题,请勾选“勾选”以接受答案。谢谢。
  • 嗨@EBDS,那么我将如何对其他列的指定类型(字符串和浮点类型)执行相同的操作?
  • @Claie 你所做的在转换为相应的类型方面是正确的。这里的问题是您希望 dt.strftime("%m/%d/%Y") 是日期时间,但此操作返回一个字符串。这就是为什么您将它们视为对象。
猜你喜欢
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2014-04-11
相关资源
最近更新 更多