【问题标题】:Why these Python codes fail in building a dummy variable?为什么这些 Python 代码无法构建虚拟变量?
【发布时间】:2021-04-15 15:43:34
【问题描述】:

我有以下数据框:

df = pd.DataFrame.from_dict({'Date': {0: '2021-01-01 00:00:00',
  1: '2021-01-02 00:00:00',
  2: '2021-01-03 00:00:00',
  3: '2021-01-04 00:00:00',
  4: '2021-01-05 00:00:00',
  5: '2021-01-06 00:00:00',
  6: '2021-01-07 00:00:00',
  7: '2021-01-08 00:00:00',
  8: '2021-01-09 00:00:00',
  9: '2021-01-10 00:00:00',
  10: '2021-01-11 00:00:00',
  11: '2021-01-12 00:00:00',
  12: '2021-01-13 00:00:00',
  13: '2021-01-14 00:00:00',
  14: '2021-01-15 00:00:00',
  15: '2021-01-16 00:00:00',
  16: '2021-01-17 00:00:00',
  17: '2021-01-18 00:00:00',
  18: '2021-01-19 00:00:00',
  19: '2021-01-20 00:00:00'}})

我想创建一个简单的虚拟变量:当数据框中的日期等于特定日期时,则为 1,否则为 0。我这样做了:

def int_21(x):
    if x == '2021-01-07':
        return '1'
    else:
        return '0'

df['comm0'] = df['Date'].apply(int_21)

但是,它只返回 0。为什么?我做错了什么?

谢谢!

【问题讨论】:

  • '2021-01-07 00:00:00' != '2021-01-07'
  • 因为您正在比较的字符串也应该与时间匹配00:00:00
  • 我也尝试过,但得到了相同的结果

标签: python pandas dataframe dummy-variable


【解决方案1】:
import pandas as pd

使用to_datetime() 方法并将您的日期列从字符串转换为日期时间:

df['Date']=pd.to_datetime(df['Date'])

最后使用apply()方法:

df['comm0']=df['Date'].apply(lambda x:1 if x==pd.to_datetime('2021-01-07') else 0)

或者按照@anky的建议:

简单使用:

df['comm0']=pd.to_datetime(df['Date']).eq('2021-01-07').astype(int)

或者 如果您熟悉numpy,那么您也可以在将日期列转换为日期时间后使用:

import numpy as np
df['comm0']=np.where(df['Date']=='2021-01-07',1,0)

【讨论】:

  • Thnx @anky 的建议...在答案中添加了这个 :)
【解决方案2】:

这是类型的问题。

df['Date'] 是一个字符串而不是日期时间对象,因此当您将每个元素与“2021-01-07”(另一个字符串)进行比较时,它们会因为时间信息(00:00:00)而有所不同。

作为解决方案,您可以将元素转换为日期时间,如下所示:

def int_21(x):
    if x == pd.to_datetime('2021-01-07'):
        return '1'
    else:
        return '0'

df['Date'] = pd.to_datetime(df['Date'])
df['comm0'] = df['Date'].apply(int_21)

或者,您仍然可以使用字符串对象,但比较元素必须具有与日期相同的格式:

def int_21(x):
    if x == '2021-01-07 00:00:00':
        return '1'
    else:
        return '0'

【讨论】:

  • 非常感谢,现在清除愚蠢的错误。奇怪的是我尝试添加零,但我一直得到相同的结果。再次感谢您的帮助
  • 非常感谢,现在清除愚蠢的错误。奇怪的是我尝试添加零,但我一直得到相同的结果。再次感谢您的帮助
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 2013-08-10
  • 2019-04-29
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多