为什么这些Python代码无法构建虚拟变量?

为什么这些Python代码无法构建虚拟变量?,python,pandas,dataframe,dummy-variable,Python,Pandas,Dataframe,Dummy Variable,我有以下数据帧: 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: '202

我有以下数据帧:

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。为什么?我做错了什么

谢谢

import pandas as pd
使用
to_datetime()
方法并将日期列从字符串转换为日期时间:

df['Date']=pd.to_datetime(df['Date'])
import numpy as np
df['comm0']=np.where(df['Date']=='2021-01-07',1,0)
最后使用
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
,则还可以在将日期列转换为日期时间后使用:

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

这是类型的问题

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

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

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'

'2021-01-07 00:00:00'
!=
'2021-01-07'
因为您正在比较也应该与时间匹配的字符串
00:00:00
我也尝试过,但得到了相同的结果Hnx@anky的建议…在回答中添加了以下内容:)非常感谢,现在清除这个愚蠢的错误。奇怪的是,我尝试添加零,但我一直得到相同的结果。再次感谢你的帮助非常感谢,现在把这个愚蠢的错误弄清楚。奇怪的是,我尝试添加零,但我一直得到相同的结果。再次感谢你的帮助