конвертировать из одного столбца pandas данных в 3 столбца на основе индекса - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть:

    col1
0   1
1   2
2   3
3   4
4   5
5   6
...

Я хочу, чтобы каждые 3 строки исходного кадра данных становились одной строкой в ​​новом кадре данных:

    col1    col2    col3
0   1       2       3
1   4       5       6
...

Есть предложения?

Ответы [ 3 ]

4 голосов
/ 29 апреля 2020

Значения фрейма данных - это массив, который можно изменить, используя метод изменения формы numpy. Затем создайте новый фрейм данных, используя измененные значения. Предполагая, что ваш существующий фрейм данных имеет вид df-

df_2 = pd.DataFrame(df.values.reshape(2, 3), columns=['col1', 'col2', 'col3'])

Это создаст новый фрейм данных из двух строк и 3 столбцов.

   col1   col2  col3
0   0      1      2
1   3      4      5
0 голосов
/ 29 апреля 2020

вы можете преобразовать col в массив numpy и затем изменить его форму.

In [27]: np.array(df['col1']).reshape( len(df) // 3 , 3 )
Out[27]:
array([[1, 2, 3],
       [4, 5, 6]])

In [..] :reshaped_cols = np.array(df['col1']).reshape( len(df) // 3 , 3 )


pd.DataFrame( data = reshaped_cols , columns = ['col1' , 'col2' , 'col3' ] )


Out[30]:
   col1  col2  col3
0     1     2     3
1     4     5     6
0 голосов
/ 29 апреля 2020

Вы можете использовать set_index и unstack, чтобы получить правильную форму, и add_preffix, чтобы изменить имя столбца:

print (df.set_index([df.index//3, df.index%3+1])['col1'].unstack().add_prefix('col'))
   col1  col2  col3
0     1     2     3
1     4     5     6

, если исходный индекс не является последовательными значениями, но вы по-прежнему хотите изменить каждые 3 строки, замените df.index на np.arange(len(df)) для обоих в set_index

...