список пандам dataframe - Python - PullRequest
       11

список пандам dataframe - Python

1 голос
/ 10 октября 2019

У меня есть следующий список:

list = [-0.14626096918979603,
 0.017925919395027533,
 0.41265398151061766]

Я создал pandas dataframe, используя следующий код:

df = pd.DataFrame(list, index=['var1','var2','var3'], columns=['Col1'])
df
               Col1
var1         -0.146261
var2         0.017926
var3         0.412654

Теперь у меня есть новый список:

list2 = [-0.14626096918979603,
 0.017925919395027533,
 0.41265398151061766,
 -0.8538301985671065,
 0.08182534201640915,
 0.40291331836021105]

Я бы хотел расположить dataframe таким образом, чтобы вывод выглядел следующим образом (РУЧНОЕ РЕДАКТИРОВАНИЕ)

               Col1            Col2
var1         -0.146261   -0.8538301985671065
var2         0.017926   0.08182534201640915
var3         0.412654   0.40291331836021105

и чтобы каждый раз был третий или четвертый столбец. .. данные расположены таким же образом. Я пытался преобразовать список в dict, но так как я новичок в python, я не получаю желаемый результат, а только ошибки из-за неправильных форм.

- РЕДАКТИРОВАТЬ -

После создания информационного кадра я хочу построить его, используя df.plot(). Тем не менее, способ отображения данных не то, что я хотел бы. Я пришел с R, поэтому я не уверен, что это из-за структуры данных, используемой в dataframe. Это то, что мне нужно одно измерение в каждом ряду?

enter image description here

Моя идея состоит в том, чтобы иметь col1, col2, col3 по оси X (это временной ряд). На оси Y диапазон значений (так что на этом графике все в порядке) и линии difnet должны отображать эволюцию var1, var2, var3 и т. Д.

Ответы [ 4 ]

2 голосов
/ 10 октября 2019

Чтобы также автоматически присваивать имена столбцам в зависимости от количества создаваемых столбцов, вы можете:

from numpy import array
from pandas import DataFrame

rows = 3
cols = int(len(list2) / rows)

data = DataFrame(array(list2).reshape(cols, rows).T)
data.columns = ['Col{}'.format(i + 1) for i in range(cols)]
data.index = ['var{}'.format(i + 1) for i in range(rows)]

Вывод:

          Col1      Col2
var1 -0.146261 -0.853830
var2  0.017926  0.081825
var3  0.412654  0.402913

Это включаетменее жесткое кодирование количества столбцов / имен столбцов.

Ваш отредактированный вопрос о построении графиков - это совсем другое, но в любом случае здесь речь идет:

import matplotlib.pyplot as plt

plt.plot(data.columns, data.T)
plt.legend(data.index)
plt.show()

Ваш график должен выглядеть лучше, посколькуу вас есть больше данных, но примеры данных имели только два столбца:

plot

2 голосов
/ 10 октября 2019

Это то, что я придумал. Вы можете легко обобщить его на большее количество столбцов / строк, динамически задавая форму

import numpy as np
import pandas as pd

np_list = np.array(list2)
list_prep = np.transpose(np_list.reshape(2, 3))

df = pd.DataFrame(list_prep, index=['v1', 'v2', 'v3'], columns=['c1', 'c2'])

И конечный результат выглядит следующим образом:

          c1        c2
v1 -0.146261 -0.853830
v2  0.017926  0.081825
v3  0.412654  0.402913
1 голос
/ 10 октября 2019

вы можете выполнить что-то вроде

df = pd.DataFrame(index = ['var1', 'var2', 'var3'])

n_cols = int(np.ceil(len(list2) / len(df)))
for ii in range(n_cols):
    L = list2[ii * len(df) : (ii + 1) * len(df)]
    df['col_{}'.format(ii)] = L

, если длина вашего списка не кратна длине информационного кадра (len(list2) % len(df) != 0, вы должны расширить L (в последнем цикле) на len(df) - (len(list2) % len(df)) Значения NaN

для ответа на второй вопрос, должно быть достаточно для запуска

df.T.plot()

для третьего вопроса, , тогда это вопросо том, как изначально проектировался фрейм данных. Вы можете редактировать код, который мы написали в начале, чтобы инвертировать строки и столбцы

df = pd.DataFrame(columns = ['var1', 'var2', 'var3'])
n_rows = int(np.ceil(len(list2) / len(df.columns)))
for ii in range(n_rows):
    L = list2[ii * len(df.columns) : (ii + 1) * len(df.columns)]
    df.loc['col_{}'.format(ii)] = L

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

df = df.T
0 голосов
/ 10 октября 2019

Простое решение


>>> pd.DataFrame({ 'a': list1, 'b': list2 })
          a         b
0 -0.146261 -0.146261
1  0.017926  0.017926
2  0.412654  0.412654
>>>

Примечание: пожалуйста, убедитесь, что вы равняетесь нет элементов в list1 и list2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...