代码之家  ›  专栏  ›  技术社区  ›  ALollz

为什么用字符串和时间增量转置数据帧会转换数据类型?

  •  9
  • ALollz  · 技术社区  · 6 年前

    我觉得这种行为很奇怪: id 列(字符串)在转换 df 如果另一列是timedelta。

    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
    

    如果没有时间差,它会像我期望的那样工作,而且 身份证件 列仍然是字符串,即使另一列是整数,并且所有字符串都可以安全地转换为整数。

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

    为什么 身份证件 第一次换衣服,第二次就不换了?

    2 回复  |  直到 6 年前
        1
  •  5
  •   piRSquared    6 年前

    应该在列中考虑数据帧。每列必须有一个数据类型。转置时,将更改新列中现在相互关联的单元格。在转置之前,有一个string列和一个timedelta列。转置后,每列都有一个字符串和一个timedelta。熊猫必须决定如何铸造新的柱。它决定采用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
    
        2
  •  -3
  •   Vonnegood    6 年前

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

    第二次您从未运行to-timedelta方法时,值将保持其原始状态,作为表的对象(字符串)。