如何获取两个列表中所有元素的组合?
如果我有两个列表
l1 = ['A', 'B']
l2 = [1, 2]
那么有什么优雅的方法可以得到一个看起来像这样的pandas数据框:
+-----+-----+-----+
| | l1 | l2 |
+-----+-----+-----+
| 0 | A | 1 |
+-----+-----+-----+
| 1 | A | 2 |
+-----+-----+-----+
| 2 | B | 1 |
+-----+-----+-----+
| 3 | B | 2 |
+-----+-----+-----+
注意,第一列是索引。
4 个回答
1
你可以使用这个叫做 merge
的函数:
df1 = pd.DataFrame(l1, columns=['l1'])
df2 = pd.DataFrame(l2, columns=['l2'])
df1.merge(df2, how='cross')
输出结果是:
l1 l2
0 A 1
1 A 2
2 B 1
3 B 2
5
你也可以使用 sklearn
这个库,它是基于 NumPy 的方法。
from sklearn.utils.extmath import cartesian
df = pd.DataFrame(cartesian((L1, L2)))
如果你想要更详细但可能更高效的变体,可以查看这个链接:Numpy: 将 x 和 y 数组点的笛卡尔积合并成一个 2D 点的数组。
23
作为一种替代方法,你可以使用pandas的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.core.reshape.util.cartesian_product
。
55
使用来自 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