Создание многоколоночного фрейма данных случайного порядка из серии в Pandas

#python #pandas

Вопрос:

Для указанного кадра данных с одним столбцом возможно ли чисто из вызовов pandas хронологически разделить на несколько столбцов длиной n после создания случайного порядка?

 df = pd.read_csv('info.csv', low_memory=False, index_col=0)
df.head(5)
 

Который первоначально читается как:

    list
0  A
1  B
2  C
3  D
4  E
 

Затем, чтобы рандомизировать порядок:

 df = df.apply(np.random.permutation)
df.head(5)
 

Который затем читается как:

    list
0  C
1  E
2  A
3  B
4  D
 

Я попытался использовать измененную версию вызова ниже, но не совсем уверен, что это уместно:

 df = pd.DataFrame([list[n:n 2] for n in range(0, len(list), 2)], columns=columnNames)
 

Я хотел бы получить завершенный кадр данных в приведенном ниже формате, в котором в данном случае длина составляет 3 строки:

    list1  list2 ... listn
0    C      B        ...
1    E      D        ...
2    A     ...       ...
 

Возможно ли это чисто из одной строки запроса pandas?

Заранее спасибо!

Ответ №1:

Вы можете использовать понимание словаря с Series для возможного создания DataFrame с общей длиной Series :

 L = np.random.permutation(df['list'])
N = 3
df = (pd.DataFrame({i: pd.Series(L[n:n N]) for i,n in enumerate(range(0, len(L), N))})
       .add_prefix('list'))
print (df)
  list0 list1
0     A     D
1     C     B
2     E   NaN
 

Решение Nnon loop, если быстрее, то лучший тест:

 N = 3
df = (pd.DataFrame({'a': np.random.permutation(df['list'])})
        .assign(b = lambda x: x.index // N, c = lambda x: x.index % N)
        .pivot('c','b','a')
        .add_prefix('list')
        .rename_axis(index=None, columns=None))


print (df)
  list0 list1
0     B     D
1     A     C
2     E   NaN