массивы в столбцы фрейма данных pandas

#python #arrays #pandas #numpy #dataframe

#python #массивы #pandas #numpy #фрейм данных

Вопрос:

У меня есть программа, которая выводит массивы.

Например:

 [[0, 1, 0], [0, 0, 0], [1, 3, 3], [2, 4, 4]]
  

Я хотел бы превратить эти массивы в фрейм данных, используя pandas. Однако, когда я делаю, значения становятся значениями строк, подобными этому:

img

Как вы можете видеть, каждый массив в общем массиве становится отдельной строкой. Я бы хотел, чтобы каждый массив в общем массиве стал собственным столбцом с именем столбца.

Кроме того, в моем случае количество массивов в массиве является переменным. Может быть 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