2014-09-03 4 views
8

Если у меня есть два спискаПолучите все комбинации элементов из двух списков?

l1 = [ 'A', 'B' ] 

l2 = [ 1, 2 ] 

, что является самым изящным способом, чтобы получить кадр данных панд, которая выглядит как:

+-----+-----+-----+ 
|  | l1 | l2 | 
+-----+-----+-----+ 
| 0 | A | 1 | 
+-----+-----+-----+ 
| 1 | A | 2 | 
+-----+-----+-----+ 
| 2 | B | 1 | 
+-----+-----+-----+ 
| 3 | B | 2 | 
+-----+-----+-----+ 

Примечание, первый столбец индекс.

ответ

18

использование product из itertools:

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

В качестве альтернативы вы можете использовать панда 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 с правильным ориентиром ...

Примечание: previou sly cartesian_product было размещено по номеру pd.tools.util.cartesian_product.

+0

* atm есть файл pd.MultiIndex.from_product, не знаю, насколько полезен конструктор DataFrame ... * –

+1

Как и pandas 0.20.2, 'cartesian_product()' находится в 'pd.core.reshape.util' , Это решение быстрее, чем использование 'itertools.product', и может быть сделано еще быстрее, инициализируя dataframe с помощью' np.array(). Вместо этого вместо данных без распаковки. –

Смежные вопросы