【问题标题】:Convert datetime Series into integer index将日期时间系列转换为整数索引
【发布时间】:2017-06-17 21:44:38
【问题描述】:

我有一个熊猫系列,其中数据是日期时间类型。我想将其转换为唯一的整数索引。我正在寻找一个直接、快速的命令,因为数据很大。

示例:

           0
    0  2015-07-05
    1  2015-07-12
    3  2015-07-19
    4  2015-07-12

应转换为:

       0
    0  1
    1  2
    3  3
    4  2

其实我也想知道有没有通用的命令,可以通过这种方式将一系列任意数据类型转换成一系列唯一整数。

【问题讨论】:

    标签: python python-3.x pandas indexing series


    【解决方案1】:

    使用factorize:

    s = pd.Series(['2015-07-05', '2015-07-12', '2015-07-19', '2015-07-12'], name=0)
    print (s)
    0    2015-07-05
    1    2015-07-12
    2    2015-07-19
    3    2015-07-12
    Name: 0, dtype: object
    
    s1 = pd.Series(pd.factorize(s)[0] + 1, s.index)
    print (s1)
    0    1
    1    2
    3    3
    4    2
    dtype: int64
    

    另一个可能的解决方案是rank:

    s1 = s.rank(method='dense').astype(int)
    print (s1)
    0    1
    1    2
    2    3
    3    2
    Name: 0, dtype: int32
    

    时间安排不同:

    s = pd.concat([s]*100000).reset_index(drop=True)
    
    In [78]: %timeit (pd.Series(pd.factorize(s)[0] + 1, s.index))
    100 loops, best of 3: 13.9 ms per loop
    
    In [79]: %timeit (s.rank(method='dense').astype(int))
    1 loop, best of 3: 536 ms per loop
    

    【讨论】:

    • 我喜欢
    • 谢谢,我可以认为这是一种通用方法吗?也就是说,对于所有其他数据类型,不仅是日期时间
    • 是的,这是一般的做法,见docs
    • 谢谢!最后一个问题:如果唯一索引是针对两列的呢?也就是说,我们有两列,而不是系列,我们希望每一对都有一个唯一的索引。
    • 然后有必要创建新系列 - 有两种可能的解决方案 - check here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多