Как вставить список в мультииндексный фрейм данных? - PullRequest
1 голос
/ 26 марта 2019

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

Я хочу вставить 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

Ниже ожидаемые результаты. Я хотел бы последовательно поместить каждый список1 и список2 в кадр данных вместо 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, заменить функции, чтобы сделать это, но не удалось

В более сложных 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[m1&m2]['Val6'], df_list1)

К сожалению, я понятия не имею, чтобы решить эту проблему. Т_Т

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

1 Ответ

1 голос
/ 26 марта 2019

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
...