如何将列表粘贴到多索引数据框中?

时间:2019-03-26 02:22:40

标签: python pandas list dataframe multi-index

您能否让我知道如何将列表粘贴到多索引数据框中?

我想将list1粘贴到列([func1-输入-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放入数据框,而不是像下面的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,替换函数来执行此操作,但是失败了

在更复杂的数据帧中,我认为最好在数据帧中使用多索引掩码。

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)

不幸的是,我不知道要解决这个问题。 T_T

请给我一些建议。

1 个答案:

答案 0 :(得分:1)

IIUC在末尾添加了一行,像非多索引数据框一样简单地对其进行修改:

ref return

因此您的代码应为:

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)