猿问

在multiindex数据框和fillna中创建新列

假设我有以下使用以下代码生成的多索引数据框:


import pandas as pd, numpy as np


names = ['Name1','Name2','Name3','Name4']

values = ['x1','x2','x3','x4']

categories = ['y1','y2','y3']


x1 = pd.Series([0, 0, 0], index=categories)


index = pd.MultiIndex.from_product([names, values]); placeholders = np.zeros((len(names)*len(values), len(categories)))


df = pd.DataFrame(placeholders, index=index, columns=categories)


for i in names:

    for j in values:

        df.loc[i,j] = x1


           y1   y2   y3

Name1 x1  0.0  0.0  0.0

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0

Name2 x1  0.0  0.0  0.0

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0

Name3 x1  0.0  0.0  0.0

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0

Name4 x1  0.0  0.0  0.0

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0

当目录中的给定名称(即Name1,Name2,Name3等)不是键时,如何使用以下字典来填充与行y3相对应的列x1并填充np.nan该y3列中任何其他行的值字典?


{'Name1': 54, 'Name3': 50}

预期的输出(0可能是np.nan):


           y1   y2   y3

Name1 x1  0.0  0.0   54

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0

Name2 x1  0.0  0.0  0.0

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0

Name3 x1  0.0  0.0   50

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0

Name4 x1  0.0  0.0  0.0

      x2  0.0  0.0  0.0

      x3  0.0  0.0  0.0

      x4  0.0  0.0  0.0


慕的地8271018
浏览 183回答 3
3回答

泛舟湖上清波郎朗

惯用的方法可能是使用 updateIn [31]: df2 = pd.DataFrame({(k,'x1'): {'y3': v} for k, v in d.items()}).TIn [32]: df2Out[32]:           y3Name1 x1  54Name3 x1  50In [33]: df.update(df2)In [34]: dfOut[34]:            y1   y2    y3Name1 x1  0.0  0.0  54.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0Name2 x1  0.0  0.0   0.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0Name3 x1  0.0  0.0  50.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0Name4 x1  0.0  0.0   0.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0

温温酱

您可以创建更新df,然后使用 updated={'Name1': 54, 'Name3': 50}updatedf=pd.DataFrame(data=list(d.values()),columns=['y3'],index=pd.MultiIndex.from_arrays([list(d.keys()),['x1','x1']]))df.update(updatedf)dfOut[229]:            y1   y2    y3Name1 x1  0.0  0.0  54.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0Name2 x1  0.0  0.0   0.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0Name3 x1  0.0  0.0  50.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0Name4 x1  0.0  0.0   0.0      x2  0.0  0.0   0.0      x3  0.0  0.0   0.0      x4  0.0  0.0   0.0

心有法竹

有很多方法可以做到这一点,一种简单的方法是使用.loc索引器:d = {'Name1': 54, 'Name3': 50}for i in d.keys():    df.loc[i,'x1']['y3'] = d[i]
随时随地看视频慕课网APP

相关分类

Python
我要回答