Добавить многоуровневый столбец в фрейм данных

#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 после каждого добавленного столбца. И, к сожалению, мне также нужен индекс, как указано выше. Возможно ли это?