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

时间:2020-06-29 12:29:12

标签: python pandas dataframe

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

mockito-scala

但是,要尝试进行列表理解,我想将其转换,但是我什么也没得到。

我尝试了以下操作:

scalamock

但是它不起作用。

谢谢!

3 个答案:

答案 0 :(得分:3)

我认为这里是更好,更轻松的第一个解决方案,例如列表理解。

或使用DataFrame.apply

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

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

可以使用列表理解的解决方案-值由DataFrame.pop提取,由concat连接在一起,也使用相同的列顺序(如有必要)DataFrame.reindex

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

答案 1 :(得分:0)

这里的问题是列表理解将很难将列中的值重新分配给数据框。无论如何,您都可以用它重新创建数据框,但是列表理解本身并不能解决问题:

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

答案 2 :(得分:0)

如果您确实想要list理解,那么您必须接受一个事实,即您将获得list,因此没有list理解代码会真正等效回到您的原始循环。

但是,类似的代码可能看起来像这样:

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

但实际上看起来您可能想要使用其他方法,例如@jezrael answer中的建议。