为什么使用字符串和timedeltas转换数据框转换dtype?

时间:2018-06-15 20:11:47

标签: python pandas

这种行为对我来说似乎很奇怪:如果另一列是timedelta,id列(字符串)在转置df时会转换为时间戳。

import pandas as pd
df = pd.DataFrame({'id': ['00115', '01222', '32333'],
                   'val': [12, 14, 170]})
df['val'] = pd.to_timedelta(df.val, unit='M')

print(df.T)
#                         0                      1                      2
#id  0 days 00:00:00.000000 0 days 00:00:00.000001 0 days 00:00:00.000032
#val      365 days 05:49:12      426 days 02:47:24     5174 days 06:27:00

type(df.T[0][0])
#pandas._libs.tslib.Timedelta

没有timedelta它按照我的预期工作,id列仍然是一个字符串,即使另一列是一个整数,所有字符串都可以安全地转换为整数。

df2 = pd.DataFrame({'id': ['00115', '01222', '32333'],
                    'val': [1, 1231, 1413]})

type(df2.T[0][0])
#str

为什么第一个实例中id的类型会改变,而第二个实例却不会改变?

2 个答案:

答案 0 :(得分:5)

应该在列中考虑数据框。每列必须具有单一数据类型。转置时,您正在更改新列中现在相互关联的单元格。在转置之前,您有一个字符串列和一个timedelta列。转置后,每列都有一个字符串和一个timedelta。熊猫必须决定如何施放新的列。它决定与timedelta一起去。我认为这是一个愚蠢的选择。

您可以通过更改新构造的数据框上的dtype来更改此行为。

pd.DataFrame(df.values.T, df.columns, df.index, dtype=object)

                     0                  1                   2
id               00115              01222               32333
val  365 days 05:49:12  426 days 02:47:24  5174 days 06:27:00

答案 1 :(得分:-3)

使用方法to_timedelta的目的是按照https://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_timedelta.html 将参数转换为timedelta 。这将更新类型。

第二次从未运行to_timedelta方法并且值保持原始状态,作为表的对象(字符串)。

相关问题