2015-11-10 83 views
2

有没有办法从元组生成器创建一个pd.Series? 我的代码如下所示,但我敢肯定有一个更好的方法:熊猫:从元组生成器创建一个系列

import numpy as np 
import pandas as pd 
g = ((n, s) for n, s in [("A", 1), ("B", 2), ("C", 3), ("D", 4), ("E", 5)]) 
arr = np.array(list(g)) 
ind, val = arr[:, 0], arr[:, 1] 

pd.Series(val, index=ind) 

回答

4

下面是一个使用DataFrame构造一种替代方案:

>>> g = ((n, s) for n, s in [("A", 1), ("B", 2), ("C", 3), ("D", 4), ("E", 5)]) 
>>> pd.DataFrame(g).set_index(0)[1] 
0 
A 1 
B 2 
C 3 
D 4 
E 5 
Name: 1, dtype: int64 

构建DataFrame后,我们设置索引列并通过选择列1返回一个Series。

这避免了任何临时列表的需要,所以可能更有效(我还没有测试过)。它还为每个列使用适当的dtypes(在这种情况下是int64),因此它避免首先创建对象数组。

3

您可以只创建两个列表,而不是

import numpy as np 
import pandas as pd 

val, ind = zip(*[(s, n) for n, s in [("A", 1), ("B", 2), ("C", 3), ("D", 4), ("E", 5)]]) 

print pd.Series(val, index=ind) 

A 1 
B 2 
C 3 
D 4 
E 5 
dtype: object