【问题标题】:How to paste a list into a multi index dataframe?如何将列表粘贴到多索引数据框中?
【发布时间】:2019-08-16 08:28:44
【问题描述】:

能否告诉我如何将列表粘贴到多索引数据框中?

我想将 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 依次放入数据框中,而不是像下面的 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中使用multi-index的掩码。

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

请给我一些建议。

【问题讨论】:

    标签: python pandas list dataframe multi-index


    【解决方案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
    

    【讨论】:

    • 感谢您的回答。这是很好的解决方案。在更复杂的数据框中,我认为最好在数据框中使用多索引掩码。不幸的是,我没有任何想法来解决这个问题。 T_T
    • 我也想多了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2014-02-17
    • 2022-01-04
    • 2019-04-05
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多