Python如何将此for循环转换为列表理解

2024-09-27 00:12:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下for循环将列中的所有值转换为datetime格式,并使用errors='concurve'处理任何不符合datetime格式的值:

for x in datecols:
    df[x] = pd.to_datetime(df[x],errors='coerce')

然而,为了尝试提前理解列表,我想转换它,但是我没有任何进展

我尝试了以下方法:

[x for x in datecols pd.to_datetime(df[x],errprs='coerce')]

但是它不起作用

谢谢


Tags: to方法indf列表fordatetime格式
3条回答

我认为这里有更好更简单的第一个解决方案,比如列表理解

或使用^{}

df[datecols] = df[datecols].apply(pd.to_datetime,errors='coerce')

df[datecols] = df[datecols].apply(lambda x: pd.to_datetime(x,errors='coerce'))

列表理解的解决方案是可能的-值由^{}提取,由^{}连接在一起,也可用于相同的列顺序(如有必要)^{}

df = pd.DataFrame({'Date_1':['2020-05-01','2020-06-02','2020-02-30'],
                   'Date_2':['1999-02-01','2000','2005-10-52'],
                   'col1':list('abc')})

print (df)
       Date_1      Date_2 col1
0  2020-05-01  1999-02-01    a
1  2020-06-02        2000    b
2  2020-02-30  2005-10-52    c

datecols = ['Date_1','Date_2']
cols = df.columns
df1 = pd.concat([pd.to_datetime(df.pop(x),errors='coerce') for x in datecols], axis=1)

df = df.join(df1).reindex(cols, axis=1)
print (df)
      Date_1     Date_2 col1
0 2020-05-01 1999-02-01    a
1 2020-06-02 2000-01-01    b
2        NaT        NaT    c

如果你真的想要一个list理解,你必须接受这样一个事实:你将得到一个list,因此没有list理解代码真正等同于你原来的循环

不过,类似的代码可能如下所示:

[pd.to_datetime(df[x], errprs='coerce') for x in datecols]

但是看起来你可能想使用一种不同的方法,就像@jezrael answer中建议的那样

这里的问题是,列表理解将很难将列中的值重新分配给数据帧。在任何情况下,您都可以使用它重新创建数据帧,但列表理解本身无法做到这一点:

df = pd.DataFrame({'Date_1':['2020-05-01','2020-06-02','AAA'],
                   'Date_2':['19990201','20000101','20051012']})

原始数据帧:

       Date_1    Date_2
0  2020-05-01  19990201
1  2020-06-02  20000101
2         AAA  2005101

提议的解决办法:

pd.DataFrame([pd.to_datetime(df[x],errors='coerce',infer_datetime_format=True) for x in df]).T

输出:

      Date_1     Date_2
0 2020-05-01 1999-02-01
1 2020-06-02 2000-01-01
2        NaT 2005-10-12

相关问题 更多 >

    热门问题