#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