如何获取两个列表中所有元素的组合?

37 投票
4 回答
35840 浏览
提问于 2025-04-19 11:59

如果我有两个列表

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

使用来自 itertoolsproduct 函数:

>>> 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

撰写回答