Pandas:从元组生成器创建系列
Pandas: creating a Series from a tuple generator
有没有办法从元组生成器创建 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)
您可以只创建两个列表
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
这是使用 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列来设置索引列和return一个Series。
这避免了对任何临时列表的需要,因此可能会更有效率(我还没有测试过)。它还为每一列使用适当的数据类型(在本例中为 int64),因此它避免了首先创建对象数组。
有没有办法从元组生成器创建 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)
您可以只创建两个列表
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
这是使用 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列来设置索引列和return一个Series。
这避免了对任何临时列表的需要,因此可能会更有效率(我还没有测试过)。它还为每一列使用适当的数据类型(在本例中为 int64),因此它避免了首先创建对象数组。