如何基于df.loc覆盖数据框列并使用datetime映射

时间:2019-06-03 22:17:19

标签: python pandas

我需要在dataframe列中将整数转换为datetime对象,该列具有混合数据类型。要知道是否应用该功能,我需要引用另一列。

我已经能够通过将数据帧转换为字典并对其进行遍历来解决此问题,但是当数据太大时花费的时间太长。

当我尝试使用.loc和.map解决此问题时,仅当我未设置相等性时,它才会提供正确的输出。

这是我的数据框。

df = pd.DataFrame([
    {'data' : 'abc', 'type': 'string'},
    {'data' : 1559347200000, 'type': 'int'},
    {'data': pd.to_datetime(1559347200000, unit='ms'), 'type':'datetime'}
    ])

运行此命令时,数据框的行为符合预期。列:“数据”具有混合类型,列:“类型”是我创建的,目的是让我知道列“数据”中的内容。

现在我需要将“数据”转换为日期时间对象,其中“类型” =“整数”。

df.loc[df['type']=='int', 'data'].map(lambda x:pd.to_datetime(x,unit='ms'))

此dtype:datetime64的'2019-06-01'的输出看起来正确。

但是,当我使用以下命令将其设置为等于自身时:

df.loc[df['type']=='int', 'data'] = df.loc[df['type']=='int', 'data'].map(lambda x:pd.to_datetime(x,unit='ms'))

然后致电:

df.loc[df['type']=='int', 'data']

我得到了1559347200000000000的输出

在这种情况下为什么它不返回“ 2019-06-01”?

1 个答案:

答案 0 :(得分:1)

执行快捷方式,而不是根据“类型”列中的内容检查“类型”列是什么,然后将更改应用于“数据”列。在lambda表达式内的“数据”列中检查值的类型,如果它是int类型,则转换为datetime,否则保持不变。

df=df.applymap(lambda x: pd.to_datetime(x,unit='ms') if type(x) is int else x)

输出:

                  data      type
0                  abc    string
1  2019-06-01 00:00:00       int
2  2019-06-01 00:00:00  datetime