为什么我不能使用Python pandas将一个系列类型设置为另一个系列类型

3

我是一名新手Python开发者,如果我的问题过于简单请多包涵。

我有一个数据框(dataframe),我的目标是将该数据框的值转换为另一种类型并替换该列。以下是代码:

strtotime = {}
for x in range(0,len(results['CreationDate'])):
    strtotime[x] = datetime.strptime(results['CreationDate'][x], '%Y-%m-%dT%H:%M:%S.%f')
results['CreationDate'] = pd.to_datetime(pd.Series(strtotime))

我将值存储为字典,使用pd.Series将其转换为系列,此时我相当确定我可以用另一个系列替换一个系列:

results['CreationDate'] = pd.to_datetime(pd.Series(strtotime))

但是,我得到的结果是一列NaT,而不是这些整洁的日期时间2015-01-01 10:59:37.403

然后我使用了results['CreationDate'] = list(pd.to_datetime(pd.Series(strtotime)))

这正是我想要的。所以我的问题是为什么会这样?这是否与对象类型有关?

1个回答

3
当你将一个Series赋值给DataFrame列时,pandas会根据索引匹配新值。原始的DataFrame可能具有一些有意义的索引,但是新的Series只有默认索引0、1、2、3等,因为它们是字典中的键。以下是一个简单的例子:
>>> d = pandas.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[10, 11, 12])
>>> d
    A  B
10  1  4
11  2  5
12  3  6
>>> d["C"] = pandas.Series([8, 88, 888])
>>> d
    A  B   C
10  1  4 NaN
11  2  5 NaN
12  3  6 NaN
>>> d["C"] = pandas.Series([8, 88, 888], index=[10, 11, 12])
>>> d
    A  B    C
10  1  4    8
11  2  5   88
12  3  6  888

请注意,将具有错误索引的系列分配给结果为NaN,但使用相同索引创建新系列会将值按预期放入。
在您的情况下,通过对原始列的每个元素应用函数来创建新系列。不要迭代执行此操作。使用 .map 方法即可。在这种情况下,有一个内置的pandas函数可将字符串转换为日期时间:
results['CreationDate'] = results['CreationDate'].map(pandas.to_datetime)

.map 方法返回一个与旧数据具有相同索引的新 Series。(如果您的日期无法正确解析,则可以应用一个 lambda 函数来提供 to_datetimeformat 参数。)

(正如 piRsquared 在评论中指出的那样,to_datetime 实际上接受一个 Series 参数,因此您只需执行 results['CreationDate'] = pandas.to_datetime(results['CreationDate']) 即可。)


pd.Series(strtotime) 是从一个字典创建的。也就是说,索引被指定了,因此没有使用默认值。不过,你的观点仍然是正确的。此外,这个答案非常好,解释得非常透彻,值得得到赞同。 - piRSquared
另外,当pd.to_datetime接受一个pd.Series时,我不会使用map。这应该可以工作:pandas.to_datetime(results['CreationDate']) - piRSquared
@piRSquared:啊,我忘记了你可以像那样直接传递Series,是的,那是更好的。 - BrenBarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接