#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. Я также обдумываю это подробнее. Спасибо