这种行为对我来说似乎很奇怪:如果另一列是时间增量,则在转置df
时将id
列(一个字符串)转换为时间戳。
import pandas as pd
df = pd.DataFrame({'id': ['00115', '01222', '32333'],
'val': [12, 14, 170]})
df['val'] = pd.to_timedelta(df.val, unit='Minutes')
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
如果没有时间增量,它的工作方式与我预期的一样,并且id
列仍然是一个字符串,即使另一列是整数,并且所有字符串都可以安全地转换为整数。
df2 = pd.DataFrame({'id': ['00115', '01222', '32333'],
'val': [1, 1231, 1413]})
type(df2.T[0][0])
#str
为什么id
的类型在第一个实例中发生了变化,而在第二个实例中没有变化?
发布于 2018-06-16 04:31:22
数据帧应该以列的形式来考虑。每列必须具有单一的数据类型。转置时,将更改新列中现在相互关联的单元格。在transpose之前,您有一个字符串列和一个时间增量列。在转置之后,每列都有一个字符串和一个时间增量。熊猫必须决定如何投射新的列。它决定使用timedelta。我认为这是一个愚蠢的选择。
您可以通过更改新构造的数据帧上的数据类型来更改此行为。
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
https://stackoverflow.com/questions/50882090
复制相似问题