#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()