Самый быстрый способ создать строки данных pandas для комбинации значений из списков - PullRequest
0 голосов
/ 07 ноября 2018

скажем, у меня есть три списка

listA = ['a','b','c', 'd']
listP = ['p', 'q', 'r']
listX = ['x', 'z']

, поэтому в кадре данных будет 4 * 3 * 2 = 24 строки. Теперь самый простой способ решить эту проблему - это сделать:

df = pd.DataFrame(columns=['A','P','X'])

for val1 in listA:
   for val2 in listP:
      for val3 in listX:
         df.loc[<indexvalue>] = [val1,val2,val3]

Теперь в реальном сценарии у меня будет около 800 тыс. Строк и 12 столбцов (таким образом, 12 вложений в циклах). Есть ли способ, как я могу создать этот фрейм данных гораздо быстрее?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Подобное обсуждение здесь . Очевидно, np.meshgrid более эффективен для больших данных (в качестве альтернативы itertools.product.

Применение:

v = np.stack(i.ravel() for i in np.meshgrid(listA, listP, listX)).T
df = pd.DataFrame(v, columns=['A', 'P', 'X'])
>>  A  P  X
0   a  p  x
1   a  p  z
2   b  p  x
3   b  p  z
4   c  p  x
0 голосов
/ 07 ноября 2018

Вы можете использовать itertools.product :

import pandas as pd
from itertools import product

listA = ['a', 'b', 'c', 'd']
listP = ['p', 'q', 'r']
listX = ['x', 'z']

df = pd.DataFrame(data=list(product(listA, listP, listX)), columns=['A','P','X'])
print(df.head(10))

выход

   A  P  X
0  a  p  x
1  a  p  z
2  a  q  x
3  a  q  z
4  a  r  x
5  a  r  z
6  b  p  x
7  b  p  z
8  b  q  x
9  b  q  z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...