将元组列表转换为系列的最快方法

时间:2016-11-28 18:07:28

标签: python pandas numpy

考虑一个元组列表lst

lst = [('a', 10), ('b', 20)]

问题
将此转换为系列

的最快方法是什么?
i
a    10
b    20
Name: c, dtype: int64

尝试

pd.DataFrame(lst, list('ic')).set_index('i').c

效率低下。

4 个答案:

答案 0 :(得分:11)

@Divakar's np.asarray(lst)的两个可能的缺点 - 它将所有内容转换为字符串,需要Pandas将其转换回来。速度制作阵列相对昂贵。

另一种方法是使用zip(*)成语“转置”列表:

In [65]: lst = [('a', 10), ('b', 20), ('j',1000)]
In [66]: zlst = list(zip(*lst))
In [67]: zlst
Out[67]: [('a', 'b', 'j'), (10, 20, 1000)]
In [68]: out = pd.Series(zlst[1], index = zlst[0])
In [69]: out
Out[69]: 
a      10
b      20
j    1000
dtype: int32

请注意,我的dtype是int,而不是object。

In [79]: out.values
Out[79]: array(['10', '20', '1000'], dtype=object)

所以在数组的情况下,Pandas不会将值转换回整数;它把它们留作字符串。

==============

我对时间的猜测是关闭的 - 我对熊猫系列创作时间没有任何感觉。此外,样本太小,无法进行有意义的计时:

In [71]: %%timeit
    ...: out=pd.Series(dict(lst))
1000 loops, best of 3: 305 µs per loop
In [72]: %%timeit
    ...: arr=np.array(lst)
    ...: out = pd.Series(arr[:,1], index=arr[:,0])
10000 loops, best of 3: 198 µs per loop
In [73]: %%timeit
    ...: zlst = list(zip(*lst))
    ...: out = pd.Series(zlst[1], index=zlst[0])
    ...: 
1000 loops, best of 3: 275 µs per loop

或强制整数解释

In [85]: %%timeit
    ...: arr=np.array(lst)
    ...: out = pd.Series(arr[:,1], index=arr[:,0], dtype=int)
    ...: 
    ...: 
1000 loops, best of 3: 253 µs per loop

答案 1 :(得分:7)

最简单的方法是将元组列表作为字典传递:

>>> pd.Series(dict(lst))
a   10
b   20
dtype: int64

答案 2 :(得分:3)

NumPy假设常规长度列表的一种方法 -

arr = np.asarray(lst)
out = pd.Series(arr[:,1], index = arr[:,0])

示例运行 -

In [147]: lst = [('a', 10), ('b', 20), ('j',1000)]

In [148]: arr = np.asarray(lst)

In [149]: pd.Series(arr[:,1], index = arr[:,0])
Out[149]: 
a      10
b      20
j    1000
dtype: object

答案 3 :(得分:0)

pd.Series与词典理解

一起使用
pd.Series({k: v for k, v in lst})

a    10
b    20
dtype: int64