Передача списков столбцов в фрейм данных Pandas вместо списков строк

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь создать фрейм данных следующим образом:

 column_names= ["a", "b", "c"]
vals = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

df = pd.DataFrame(vals, columns=column_names)
 

Что приводит к следующему фрейму данных:

   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9
 

Я полагаю, это ожидаемый результат. Тем не менее, я пытаюсь добиться этого результата:

   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Где каждый вложенный список vals соответствует целому столбцу, а не строке.

Есть ли способ получить указанный выше фрейм данных без изменения способа передачи данных в конструктор? Или даже метод, который я могу вызвать для транспонирования фрейма данных?

Комментарии:

1. Вы хотите также изменить имена индексов и столбцов? после транспонирования?

2. вывод ясно показывает, что это правда. Я не думаю, что нам нужно закрывать этот вопрос, потому что проблема в том, как передать данные списка по строкам из данных по столбцам в pd.dataframe

Ответ №1:

Просто zip это:

 df = pd.DataFrame(dict(zip(column_names, vals)))
 

Выводит:

    a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Ответ №2:

Попробуйте присвоить столбцу имя на шаге различия —

 column_names= ["a", "b", "c"]
vals = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

df = pd.DataFrame(vals).T
df.columns = column_names
 
    a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Или, если вы можете использовать numpy, вы можете сделать это за один шаг —

 import numpy as np

column_names= ["a", "b", "c"]
vals = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

df = pd.DataFrame(vals.T, columns=column_names)
print(df)
 
    a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Ответ №3:

Используйте transpose(df.T) :

 In [3397]: df = df.T.reset_index(drop=True)

In [3398]: df.columns = column_names

In [3399]: df
Out[3399]: 
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Ответ №4:

Если использовать конструктор проще использовать zip с распаковкой списка с * :

 column_names= ["a", "b", "c"]
vals = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

df = pd.DataFrame(zip(*vals), columns=column_names)
print (df)
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Решения, если уже был создан фрейм данных:

 df = pd.DataFrame(vals, columns=column_names)
 

Используйте DataFrame.T и переназначайте столбцы со значениями индекса:

 df1 = df.T
df1.columns, df1.index = df1.index, df1.columns
print (df1)

   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Однострочное решение с транспонированием DataFrame.set_axis и DataFrame.reset_index :

 df1 = df.T.set_axis(column_names, axis=1).reset_index(drop=True)
print (df1)
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
 

Или транспонировать только массив numpy, спасибо @Henry Yik:

  df.loc[:] = df.T.to_numpy()