Pandas: создание DataFrame из серии

Мой текущий код показан ниже - я импортирую файл MAT и пытаюсь создать DataFrame из переменных внутри него:

mat = loadmat(file_path)  # load mat-file
Variables = mat.keys()    # identify variable names

df = pd.DataFrame         # Initialise DataFrame

for name in Variables:

    B = mat[name]
    s = pd.Series (B[:,1])

Итак, в цикле я могу создать серию каждой переменной (они представляют собой массивы с двумя столбцами - поэтому значения, которые мне нужны, находятся в столбце 2)

Мой вопрос: как добавить серию в dataframe? Я просмотрел документацию, и ни один из примеров не подходит для того, что я пытаюсь сделать.

С наилучшими пожеланиями,

Бен

Ответы

Ответ 1

Вот как создать DataFrame, где каждая серия - это строка.

Для одной серии (в результате получается однострочный DataFrame):

series = pd.Series([1,2], index=['a','b'])
df = pd.DataFrame([series])

Для нескольких рядов с одинаковыми индексами:

cols = ['a','b']
list_of_series = [pd.Series([1,2],index=cols), pd.Series([3,4],index=cols)]
df = pd.DataFrame(list_of_series, columns=cols)

Для нескольких рядов с возможно разными индексами:

list_of_series = [pd.Series([1,2],index=['a','b']), pd.Series([3,4],index=['a','c'])]
df = pd.concat(list_of_series, axis=1).transpose()

Чтобы создать DataFrame, где каждая серия является столбцом, см. ответы других. В качестве альтернативы можно создать DataFrame, где каждая серия представляет собой строку, как указано выше, а затем используйте df.transpose(). Однако последний подход неэффективен, если столбцы имеют разные типы данных.

Ответ 2

Не нужно инициализировать пустой DataFrame (вы даже этого не делали, вам нужно pd.DataFrame() с помощью parens). Вместо этого сделайте список Серии и объедините их вместе с df = pd.concat(series, axis=1)

Что-то вроде:

series = [pd.Series(mat[name][:, 1]) for name in Variables]
df = pd.concat(series, axis=1)

Ответ 3

Я думаю, что более простой способ, возможно, быстрее, чтобы достичь этого 1) Используйте понимание dict для получения желаемого dict (т.е. Взяв 2-й столбец каждого массива) 2) Затем используйте pd.DataFrame для создания экземпляра непосредственно из dict без цикла для каждого col и concat.

Предполагая, что ваш mat выглядит так (вы можете игнорировать это, так как ваш mat загружается из файла):

In [135]: mat = {'a': np.random.randint(5, size=(4,2)),
   .....: 'b': np.random.randint(5, size=(4,2))}

In [136]: mat
Out[136]: 
{'a': array([[2, 0],
        [3, 4],
        [0, 1],
        [4, 2]]), 'b': array([[1, 0],
        [1, 1],
        [1, 0],
        [2, 1]])}

Затем вы можете сделать:

In [137]: df = pd.DataFrame ({name:mat[name][:,1] for name in mat})

In [138]: df
Out[138]: 
   a  b
0  0  0
1  4  1
2  1  0
3  2  1

[4 rows x 2 columns]