piR*_*red 13 python numpy pandas
考虑一个元组列表 lst
lst = [('a', 10), ('b', 20)]
Run Code Online (Sandbox Code Playgroud)
问题
将此转换为系列的最快方法是什么
i
a 10
b 20
Name: c, dtype: int64
Run Code Online (Sandbox Code Playgroud)
尝试
pd.DataFrame(lst, list('ic')).set_index('i').c
Run Code Online (Sandbox Code Playgroud)
这是低效的.
hpa*_*ulj 12
两个可能的缺点@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
Run Code Online (Sandbox Code Playgroud)
请注意,我的dtype是int,而不是object.
In [79]: out.values
Out[79]: array(['10', '20', '1000'], dtype=object)
Run Code Online (Sandbox Code Playgroud)
所以在数组的情况下,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
Run Code Online (Sandbox Code Playgroud)
或者强制整数解释
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
Run Code Online (Sandbox Code Playgroud)
And*_*ndy 11
最简单的方法是将元组列表作为字典传递:
>>> pd.Series(dict(lst))
a 10
b 20
dtype: int64
Run Code Online (Sandbox Code Playgroud)