#python #arrays #pandas #numpy #dataframe
#python #массивы #pandas #numpy #фрейм данных
Вопрос:
У меня есть программа, которая выводит массивы.
Например:
[[0, 1, 0], [0, 0, 0], [1, 3, 3], [2, 4, 4]]
Я хотел бы превратить эти массивы в фрейм данных, используя pandas. Однако, когда я делаю, значения становятся значениями строк, подобными этому:
Как вы можете видеть, каждый массив в общем массиве становится отдельной строкой. Я бы хотел, чтобы каждый массив в общем массиве стал собственным столбцом с именем столбца.
Кроме того, в моем случае количество массивов в массиве является переменным. Может быть 4 массива или 70, что означает, что может быть 4 столбца или 70. Это проблематично, когда дело доходит до имен столбцов, и мне было интересно, есть ли в любом случае возможность автоматического увеличения имен столбцов в python.
Посмотрите мою попытку ниже и дайте мне знать, как я могу это решить.
Мой желаемый результат — просто превратить каждый массив в общем массиве в отдельный столбец вместо строки и иметь заголовки для столбца, которые увеличиваются с каждым дополнительным массивом / столбцом.
Большое вам спасибо.
Нужна помощь. Пожалуйста, ответьте!
frame = [[0, 1, 0], [0, 0, 0], [1, 3, 3], [2, 4, 4]]
numpy_data= np.array(frame)
df = pd.DataFrame(data=numpy_data, columns=["column1", "column2", "column3"])
print(frame)
print(df)
Ответ №1:
Возможным решением может быть transposing
и переименование столбцов после преобразования numpy
массива в dataframe
. Вот код:
import numpy as np
import pandas as pd
frame = [[0, 1, 0], [0, 0, 0], [1, 3, 3], [2, 4, 4]]
numpy_data= np.array(frame)
#transposing later
df = pd.DataFrame(data=numpy_data).T
#creating a list of columns using list comprehension without specifying number of columns
df.columns = [f'mycol{i}' for i in range(0,len(df.T))]
print(df)
Вывод:
mycol0 mycol1 mycol2 mycol3
0 0 0 1 2
1 1 0 3 4
2 0 0 3 4
Тот же код для 11 столбцов:
import numpy as np
import pandas as pd
frame = [[0, 1, 0], [0, 0, 0], [1, 3, 3], [2, 4, 4], [5, 2, 2], [6,7,8], [8,9,19] , [10,2,4], [2,6,5], [10,2,5], [11,2,9]]
numpy_data= np.array(frame)
df = pd.DataFrame(data=numpy_data).T
df.columns = [f'mycol{i}' for i in range(0,len(df.T))]
print(df)
mycol0 mycol1 mycol2 mycol3 mycol4 mycol5 mycol6 mycol7 mycol8 mycol9 mycol10
0 0 0 1 2 5 6 8 10 2 10 11
1 1 0 3 4 2 7 9 2 6 2 2
2 0 0 3 4 2 8 19 4 5 5 9
Ответ №2:
Вы можете transpose
массив и add_prefix
frame = [[0, 1, 0], [0, 0, 0], [1, 3, 3], [2, 4, 4]]
pd.DataFrame(np.array(frame).T).add_prefix('column')
Выход:
column0 column1 column2 column3
0 0 0 1 2
1 1 0 3 4
2 0 0 3 4
Работает с любым количеством массивов
frame = [[0, 1, 0], [0, 0, 0], [1, 3, 3], [2, 4, 4], [1,0,1], [2,0,3]]
pd.DataFrame(np.array(frame).T).add_prefix('column')
Выход:
column0 column1 column2 column3 column4 column5
0 0 0 1 2 1 2
1 1 0 3 4 0 0
2 0 0 3 4 1 3
Ответ №3:
Одним из способов может быть изменение его на словарь с именем столбца путем повторения каждого элемента в списке, как показано ниже:
df = pd.DataFrame({'column{}'.format(index):i for index, i in enumerate(frame)})
В качестве альтернативы, другим способом может быть использование transpose
того, что у вас уже есть. Для имен столбцов вы можете исключить при создании фрейма данных и добавить позже (не уверен, нужно ли вам numpy
):
df = pd.DataFrame(data=frame)
df = df.T # transposing
df.columns = ['column{}'.format(i 1) for i in df.columns] # adding column names
Результат (в любом случае):
column1 column2 column3 column4
0 0 0 1 2
1 1 0 3 4
2 0 0 3 4
Ответ №4:
Давайте попробуем
pd.DataFrame(dict(zip(range(len(frame)), frame)))
0 1 2 3
0 0 0 1 2
1 1 0 3 4
2 0 0 3 4