Как создать славу данных из случайных списков длиной, используя python? - PullRequest
1 голос
/ 23 апреля 2020

Я хочу создать pandas фрейм данных с несколькими списками разной длины. Ниже мой python код.

import pandas as pd

A=[1,2]
B=[1,2,3]
C=[1,2,3,4,5,6]

lenA = len(A)
lenB = len(B)
lenC = len(C)

df = pd.DataFrame(columns=['A', 'B','C'])

for i,v1 in enumerate(A):
    for j,v2 in enumerate(B):
        for k, v3 in enumerate(C):
            if(i<random.randint(0, lenA)):
                if(j<random.randint(0, lenB)):
                    if (k < random.randint(0, lenC)):
                        df = df.append({'A': v1, 'B': v2,'C':v3}, ignore_index=True)            
print(df)

Мои списки следующие:

A=[1,2]
B=[1,2,3]
C=[1,2,3,4,5,6,7]

В каждом прогоне я получал разные выходные данные, и это правильно. Но не охватывает все элементы списка в каждом прогоне. За один прогон я получил вывод ниже:

   A  B  C
0  1  1  3
1  1  2  1
2  1  2  2
3  2  2  5

В вышеприведенном выводе 'A' есть все пункты (1,2). Но в списке «B» есть только (1,2) позиции, пункт 3 отсутствует. Также в списке 'C' есть только (1,2,3,5) пунктов. (4,6,7) наименований нет в списке 'C'. Я ожидаю, что в каждом списке каждый элемент должен быть в кадре данных как минимум один раз, а элементы списка 'C' должны быть в кадре данных только один раз. Мой ожидаемый пример выходных данных выглядит следующим образом:

   A  B  C
0  1  1  3
1  1  2  1
2  1  2  2
3  2  2  5
4  2  3  4
5  1  1  7
6  2  3  6

Руководство, чтобы получить ожидаемый результат. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Вы можете добавить случайные значения каждого списка к общей длине, а затем использовать DataFrame.sample:

A=[1,2]
B=[1,2,3]
C=[1,2,3,4,5,6]

L = [A,B,C]
m = max(len(x) for x in L)
print (m)
6

a = [np.hstack((np.random.choice(x, m - len(x)), x)) for x in L]

df = pd.DataFrame(a, index=['A', 'B', 'C']).T.sample(frac=1)
print (df)
   A  B  C
2  2  2  3
0  2  1  1
3  1  1  4
4  1  2  5
5  2  3  6
1  2  2  2
0 голосов
/ 23 апреля 2020

Вы можете использовать транспонирование для достижения того же. РЕДАКТИРОВАТЬ: используется случайным образом для рандомизации вывода в соответствии с запросом.

import pandas as pd
from random import shuffle, choice


A=[1,2]
B=[1,2,3]
C=[1,2,3,4,5,6]
shuffle(A)
shuffle(B)
shuffle(C)

data = [A,B,C]

df = pd.DataFrame(data)
df = df.transpose()
df.columns = ['A', 'B', 'C']
df.loc[:,'A'].fillna(choice(A), inplace=True)
df.loc[:,'B'].fillna(choice(B), inplace=True)

Это должно дать следующие выходные данные

     A    B    C
0  1.0  1.0  1.0
1  2.0  2.0  2.0
2  NaN  3.0  3.0
3  NaN  4.0  4.0
4  NaN  NaN  5.0
5  NaN  NaN  6.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...