如果我有两个列表
l1 = [ 'A', 'B' ]
l2 = [ 1, 2 ]
获得pandas数据框的最优雅方式是什么:
+-----+-----+-----+
| | l1 | l2 |
+-----+-----+-----+
| 0 | A | 1 |
+-----+-----+-----+
| 1 | A | 2 |
+-----+-----+-----+
| 2 | B | 1 |
+-----+-----+-----+
| 3 | B | 2 |
+-----+-----+-----+
注意,第一列是索引。
答案 0 :(得分:26)
使用itertools
中的product
:
>>> from itertools import product
>>> pd.DataFrame(list(product(l1, l2)), columns=['l1', 'l2'])
l1 l2
0 A 1
1 A 2
2 B 1
3 B 2
答案 1 :(得分:10)
作为替代方案,您可以使用熊猫' cartesian_product
(对于大型numpy数组可能更有用):
In [11]: lp1, lp2 = pd.core.reshape.util.cartesian_product([l1, l2])
In [12]: pd.DataFrame(dict(l1=lp1, l2=lp2))
Out[12]:
l1 l2
0 A 1
1 A 2
2 B 1
3 B 2
使用正确的方向读入DataFrame看起来有点混乱......
注意:之前cartesian_product
位于pd.tools.util.cartesian_product
。
答案 2 :(得分:2)
您还可以使用sklearn
库,该库使用基于NumPy的方法:
from sklearn.utils.extmath import cartesian
df = pd.DataFrame(cartesian((L1, L2)))
有关更详细但可能更有效的变体,请参见Numpy: cartesian product of x and y array points into single array of 2D points。