Как вставить список в многоиндексный фрейм данных?

#python #pandas #list #dataframe #multi-index

#python #pandas #Список #фрейм данных #многоиндексный

Вопрос:

Не могли бы вы сообщить мне, как вставить список в многоиндексный фрейм данных?

Я хочу вставить list1 в столбец ([func1 — In — Name1, Name2][‘Val6’])

и list2 в столбец ([func1 — Out — Name3, Name4][‘Val6’]) в многоиндексном фрейме данных

ниже приведен фрейм данных, который я использовал

 from pandas import Series, DataFrame
raw_data = {'Function': ['env', 'env', 'env', 'func1', 'func1', 'func1'],
            'Type': ['In', 'In', 'In', 'In','In', 'out'],
            'Name': ['Volt', 'Temp', 'BD#', 'Name1','Name2', 'Name3'],
            'Val1': ['Max', 'High', '1', '3', '5', '6'],
            'Val2': ['Typ', 'Mid', '2', '4', '7', '6'],
            'Val3': ['Min', 'Low', '3', '3', '6', '3'],
            'Val4': ['Max', 'High', '4', '3', '9', '4'],
            'Val5': ['Max', 'Low', '5', '3', '4', '5'] }
df = DataFrame(raw_data)
df= df.set_index(["Function", "Type","Name"])
df['Val6'] = np.NaN

list1 = [1,2]
list2 = [3,4]

print (df)
  

ниже напечатан фрейм данных

                      Val1 Val2 Val3  Val4 Val5  Val6
Function Type Name                                  
env      In   Volt    Max  Typ  Min   Max  Max   NaN
              Temp   High  Mid  Low  High  Low   NaN
              BD#       1    2    3     4    5   NaN
func1    In   Name1     4    2    3     4    5   NaN
              Name2     6    7    6     9    4   NaN
         out  Name3     6    6    3     4    5   NaN
              Name4     3    3    4     5    6   NaN
  

Ниже приведены ожидаемые результаты.
Я хотел бы последовательно поместить каждый list1 и list2 в dataframe вместо NaN, как показано ниже

                          Val1 Val2 Val3  Val4 Val5  Val6
    Function Type Name                                  
    env      In   Volt    Max  Typ  Min   Max  Max   NaN
                  Temp   High  Mid  Low  High  Low   NaN
                  BD#       1    2    3     4    5   NaN
    func1    In   Name1     4    2    3     4    5     1
                  Name2     6    7    6     9    4     2
             out  Name3     6    6    3     4    5     3
                  Name4     3    3    4     5    6     4
  

Я пытался использовать concat, функции replace для этого, но потерпел неудачу

В более сложных datafrmae, я думаю, лучше использовать маску многоиндексности в dataframe.

 list1=[1,2]
list2=[3,4]
m1 = df.index.get_level_values(0) == 'func1'
m2 = df.index.get_level_values(1) == 'In'

list1 = [float(i) for i in list1]
df_list1=pd.DataFrame(list1)

df.replace(df[m1amp;m2]['Val6'], df_list1)
  

К сожалению, у меня нет ни малейшей идеи, как решить проблему. T_T

Пожалуйста, дайте мне несколько советов.

Ответ №1:

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

 df['Val6'] = df['Val6'].tolist()[:-4]   list1   list2
  

Итак, ваш код будет:

 from pandas import Series, DataFrame
raw_data = {'Function': ['env', 'env', 'env', 'func1', 'func1', 'func1'],
            'Type': ['In', 'In', 'In', 'In','In', 'out'],
            'Name': ['Volt', 'Temp', 'BD#', 'Name1','Name2', 'Name3'],
            'Val1': ['Max', 'High', '1', '3', '5', '6'],
            'Val2': ['Typ', 'Mid', '2', '4', '7', '6'],
            'Val3': ['Min', 'Low', '3', '3', '6', '3'],
            'Val4': ['Max', 'High', '4', '3', '9', '4'],
            'Val5': ['Max', 'Low', '5', '3', '4', '5'] }
df = DataFrame(raw_data)
df= df.set_index(["Function", "Type","Name"])
df['Val6'] = np.NaN

list1 = [1,2]
list2 = [3,4]

df['Val6'] = df['Val6'].tolist()[:-4]   list1   list2

print(df)
  

Вывод:

                      Val1 Val2 Val3  Val4 Val5  Val6
Function Type Name                                  
env      In   Volt    Max  Typ  Min   Max  Max   NaN
              Temp   High  Mid  Low  High  Low   NaN
              BD#       1    2    3     4    5   1.0
func1    In   Name1     3    4    3     3    3   2.0
              Name2     5    7    6     9    4   3.0
         out  Name3     6    6    3     4    5   4.0
  

Комментарии:

1. Спасибо за ваш ответ. Это хорошее решение. В более сложном фрейме данных, я думаю, лучше использовать маску многоиндексности в фрейме данных. К сожалению, у меня нет ни малейшей идеи, как решить проблему. T_T

2. Я также обдумываю это подробнее. Спасибо