为什么我不能将一个系列类型设置为等于 Python pandas 的另一个系列类型
Why can't I set a series type to equal another series type with Python pandas
我是 python 的新手,如果这看起来是一个简单的问题,请原谅我。
我有一个数据框。我的目标是获取数据框的值并将其转换为另一种类型并替换该列。这是代码:
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))
但我在 return 中得到的结果是一列 NaT
而不是这些整洁的日期时间 2015-01-01 10:59:37.403
。
然后我用了results['CreationDate'] = list(pd.to_datetime(pd.Series(strtotime)))
效果如我所愿。所以我的问题是为什么会这样?它甚至与对象类型有什么关系吗?
当您将系列分配给 DataFrame 列时,pandas 根据 索引 匹配新值。您的原始 DataFrame 可能有一些有意义的索引,但您的新系列它只有默认索引 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
给出一个与旧索引相同的新系列。 (如果您的日期没有正确解析,您可以应用 lambda
为 to_datetime
提供 format
参数。)
(正如 piRsquared 在评论中指出的那样,to_datetime
实际上接受了一个 Series 参数,所以你可以只做 results['CreationDate'] = pandas.to_datetime(results['CreationDate'])
。)
我是 python 的新手,如果这看起来是一个简单的问题,请原谅我。
我有一个数据框。我的目标是获取数据框的值并将其转换为另一种类型并替换该列。这是代码:
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))
但我在 return 中得到的结果是一列 NaT
而不是这些整洁的日期时间 2015-01-01 10:59:37.403
。
然后我用了results['CreationDate'] = list(pd.to_datetime(pd.Series(strtotime)))
效果如我所愿。所以我的问题是为什么会这样?它甚至与对象类型有什么关系吗?
当您将系列分配给 DataFrame 列时,pandas 根据 索引 匹配新值。您的原始 DataFrame 可能有一些有意义的索引,但您的新系列它只有默认索引 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
给出一个与旧索引相同的新系列。 (如果您的日期没有正确解析,您可以应用 lambda
为 to_datetime
提供 format
参数。)
(正如 piRsquared 在评论中指出的那样,to_datetime
实际上接受了一个 Series 参数,所以你可以只做 results['CreationDate'] = pandas.to_datetime(results['CreationDate'])
。)