gpt4 book ai didi

python - 为什么转置带有字符串和时间增量的 DataFrame 会转换数据类型?

转载 作者:太空狗 更新时间:2023-10-29 20:29:47 25 4
gpt4 key购买 nike

这种行为对我来说似乎很奇怪:如果另一列是时间增量,则 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='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

如果没有 timedelta,它会像我预期的那样工作,并且 id 列仍然是一个字符串,即使另一列是一个整数并且所有字符串都可以安全地转换为整数。

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

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

为什么 id 的类型在第一个实例中发生了变化,但在第二个实例中却没有?

最佳答案

数据框应该按列来考虑。每列必须具有单一数据类型。转置时,您正在更改新列中现在相互关联的单元格。在转置之前,您有一个字符串列和一个时间增量列。转置后,每一列都有一个字符串和一个时间增量。 Pandas 必须决定如何转换新列。它决定使用 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

关于python - 为什么转置带有字符串和时间增量的 DataFrame 会转换数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50882090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com