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]