#python #pandas #multi-index #multi-level
#python #панды #многоиндексный #многоуровневый
Вопрос:
В начале я хотел бы добавить многоуровневый столбец в пустой фрейм данных.
df = pd.DataFrame({"nodes": list(range(1, 5, 2))})
df.set_index("nodes", inplace=True)
Итак, это фрейм данных для начала (все еще пустой):
>>> df
nodes
1
3
Теперь я хотел бы получить первый многоуровневый столбец.
Я попробовал следующее:
new_df = pd.DataFrame.from_dict(dict(zip(df.index, [1,2])), orient="index",
columns=["value"])
df = pd.concat([new_df], axis=1, keys=["test"])
Теперь df
фрейм данных выглядит следующим образом:
>>> df
test
value
1 1
3 2
Чтобы добавить еще один столбец, я сделал нечто подобное.
new_df2 = pd.DataFrame.from_dict(dict(zip(df.index, [3,4])), orient="index",
columns=[("test2", "value2")])
df = pd.concat([df, new_df2], axis=1)
df.index.name = "nodes"
Итак, желаемый фрейм данных выглядит следующим образом:
>>> df
test test2
nodes value value2
1 1 3
3 2 4
Этот способ добавления многоуровневых столбцов кажется немного странным. Есть ли лучший способ сделать это?
Ответ №1:
Создайте мультиндекс для столбцов, сохранив ваши фреймы данных в dict
последовательном axis=1
объединении . Ключи dict становятся уровнями MultiIndex столбца (если вы используете кортежи, он добавляет несколько уровней в зависимости от длины, скалярные ключи добавляют один уровень), а столбцы DataFrame остаются как есть. Выравнивание выполняется для индекса строки.
import pandas as pd
d = {}
d[('foo', 'bar')] = pd.DataFrame({'val': [1,2,3]}).rename_axis(index='nodes')
d[('foo2', 'bar2')] = pd.DataFrame({'val2': [4,5,6]}).rename_axis(index='nodes')
d[('foo2', 'bar1')] = pd.DataFrame({'val2': [7,8,9]}).rename_axis(index='nodes')
pd.concat(d, axis=1)
foo foo2
bar bar2 bar1
val val2 val2
nodes
0 1 4 7
1 2 5 8
2 3 6 9
Комментарии:
1. Мне нужно обновлять фрейм данных с течением времени (не все столбцы сразу). Но мне также нужно иметь dataframe после каждого добавленного столбца. И, к сожалению, мне также нужен индекс, как указано выше. Возможно ли это?