为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地8271018 2021-04-01 10:15:05
假设我有以下使用以下代码生成的多索引数据框:import pandas as pd, numpy as npnames = ['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   y3Name1 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.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  0.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当目录中的给定名称(即Name1,Name2,Name3等)不是键时,如何使用以下字典来填充与行y3相对应的列x1并填充np.nan该y3列中任何其他行的值字典?{'Name1': 54, 'Name3': 50}预期的输出(0可能是np.nan):           y1   y2   y3Name1 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.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      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
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

惯用的方法可能是使用 update


In [31]: df2 = pd.DataFrame({(k,'x1'): {'y3': v} for k, v in d.items()}).T


In [32]: df2

Out[32]: 

          y3

Name1 x1  54

Name3 x1  50


In [33]: df.update(df2)


In [34]: df

Out[34]: 

           y1   y2    y3

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


查看完整回答
反对 回复 2021-04-20
?
温温酱

TA贡献1752条经验 获得超4个赞

您可以创建更新df,然后使用 update


d={'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)

df

Out[229]: 

           y1   y2    y3

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


查看完整回答
反对 回复 2021-04-20
?
心有法竹

TA贡献1866条经验 获得超5个赞

有很多方法可以做到这一点,一种简单的方法是使用.loc索引器:


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


for i in d.keys():

    df.loc[i,'x1']['y3'] = d[i]


查看完整回答
反对 回复 2021-04-20
  • 3 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号