Python 使用s.loc和s.first_有效_索引()时出现KeyError

Python 使用s.loc和s.first_有效_索引()时出现KeyError,python,pandas,loc,Python,Pandas,Loc,我有类似于这篇文章的数据: 也就是说,我有很多观察会议的数据,每个会议都有一个焦点人物。该联系人只记录一次,但我想在该会话期间填写每行的联系人ID数据。因此,数据如下所示: Focal Session 0 NaN 1 1 50101 1 2 NaN 1 3 NaN 2 4 50408 2 5 NaN 2 基于上面链接的帖子,我使用了以下代码: g = data.groupby('Sessio

我有类似于这篇文章的数据:

也就是说,我有很多观察会议的数据,每个会议都有一个焦点人物。该联系人只记录一次,但我想在该会话期间填写每行的联系人ID数据。因此,数据如下所示:

     Focal    Session
0    NaN      1
1    50101    1
2    NaN      1
3    NaN      2
4    50408    2
5    NaN      2
基于上面链接的帖子,我使用了以下代码:

g = data.groupby('Session')

g['Focal'].transform(lambda s: s.loc[s.first_valid_index()])
但这将返回一个keyrerror(特别是keyrerror:None)。根据.loc文档,当找不到数据时,可能会导致KeyErrors。所以,我检查了一下,虽然我有152个会话,但焦点列中只有150个非空数据点。在我决定手动搜索哪些会话缺少焦点ID的数据之前,我有两个问题:

  • 我是个初学者。那么,这是我得到一个键错误的合理解释吗

  • 如果合理的话,有没有办法找出哪个会话缺少焦点ID数据,这样我就不用手动查看数据了

  • 此处输出:

    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    <ipython-input-330-0e4f27aa7e14> in <module>()
    ----> 1 data['Focal'] = g['Focal'].transform(lambda s: s.loc[s.first_valid_index()])
          2 g['Focal'].transform(lambda s: s.loc[s.first_valid_index()])
    
    //anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in transform(self, func,     *args, **kwargs)
       1540         for name, group in self:
       1541             object.__setattr__(group, 'name', name)
    -> 1542             res = wrapper(group)
       1543             # result[group.index] = res
       1544             indexer = self.obj.index.get_indexer(group.index)
    
    //anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in <lambda>(x)
       1536             wrapper = lambda x: getattr(x, func)(*args, **kwargs)
       1537         else:
    -> 1538             wrapper = lambda x: func(x, *args, **kwargs)
       1539 
       1540         for name, group in self:
    
    <ipython-input-330-0e4f27aa7e14> in <lambda>(s)
    ----> 1 data['Focal'] = g['Focal'].transform(lambda s: s.loc[s.first_valid_index()])
          2 g['Focal'].transform(lambda s: s.loc[s.first_valid_index()])
    
    //anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in __getitem__(self, key)
        669             return self._getitem_tuple(key)
        670         else:
    --> 671             return self._getitem_axis(key, axis=0)
        672 
        673     def _getitem_axis(self, key, axis=0):
    
    //anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _getitem_axis(self, key, axis)
        756             return self._getitem_iterable(key, axis=axis)
        757         else:
    --> 758             return self._get_label(key, axis=axis)
        759 
        760 class _iLocIndexer(_LocationIndexer):
    
    //anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _get_label(self, label, axis)
         58             return self.obj._xs(label, axis=axis, copy=False)
         59         except Exception:
    ---> 60             return self.obj._xs(label, axis=axis, copy=True)
         61 
         62     def _get_loc(self, key, axis=0):
    
    //anaconda/lib/python2.7/site-packages/pandas/core/series.pyc in _xs(self, key, axis, level, copy)
        570 
        571     def _xs(self, key, axis=0, level=None, copy=True):
    --> 572         return self.__getitem__(key)
        573 
        574     def _ixs(self, i, axis=0):
    
    //anaconda/lib/python2.7/site-packages/pandas/core/series.pyc in __getitem__(self, key)
        611     def __getitem__(self, key):
        612         try:
    --> 613             return self.index.get_value(self, key)
        614         except InvalidIndexError:
        615             pass
    
    //anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in get_value(self, series, key)
        761         """
        762         try:
    --> 763             return self._engine.get_value(series, key)
        764         except KeyError, e1:
        765             if len(self) > 0 and self.inferred_type == 'integer':
    
    //anaconda/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_value (pandas/index.c:2565)()
    
    //anaconda/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_value (pandas/index.c:2380)()
    
    //anaconda/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_loc (pandas/index.c:3166)()
    
    KeyError: None
    
    ---------------------------------------------------------------------------
    KeyError回溯(最近一次呼叫最后一次)
    在()
    ---->1数据['Focal']=g['Focal'].变换(lambda s:s.loc[s.first\u valid\u index())
    2 g['Focal'].变换(lambda s:s.loc[s.first\u valid\u index())
    //转换中的anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc(self、func、*args、**kwargs)
    1540代表姓名,自组:
    1541对象。设置属性(组“名称”,名称)
    ->1542 res=包装器(组)
    1543#结果[组索引]=res
    1544索引器=self.obj.index.get\u索引器(group.index)
    //anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in(x)
    1536 wrapper=lambda x:getattr(x,func)(*args,**kwargs)
    1537其他:
    ->1538 wrapper=lambda x:func(x,*args,**kwargs)
    1539
    1540代表姓名,自组:
    在(s)
    ---->1数据['Focal']=g['Focal'].变换(lambda s:s.loc[s.first\u valid\u index())
    2 g['Focal'].变换(lambda s:s.loc[s.first\u valid\u index())
    //anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in____getitem____(self,key)
    669返回self.\u getitem\u元组(键)
    670其他:
    -->671返回自。\u获取项目\u轴(键,轴=0)
    672
    673定义获取项目轴(自身、键、轴=0):
    //anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in_getitem_axis(self、key、axis)
    756返回自我。\u获取项目\u可编辑(键,轴=轴)
    757其他:
    -->758返回自我。获取标签(键,轴=轴)
    759
    760类iLocIndexer(\u位置索引器):
    //anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in_get_标签(self、label、axis)
    58返回自身对象(标签,轴=轴,复制=假)
    59例外情况除外:
    --->60返回self.obj.xs(标签,轴=轴,副本=真)
    61
    62 def_get_loc(自身、键、轴=0):
    //anaconda/lib/python2.7/site-packages/pandas/core/series.pyc in_xs(self、key、axis、level、copy)
    570
    571 def_xs(自身、键、轴=0、级别=无、复制=真):
    -->572返回自我。获取项目(键)
    573
    574 def_ixs(自、i、轴=0):
    //anaconda/lib/python2.7/site-packages/pandas/core/series.pyc in____getitem_u__(self,key)
    611定义获取项目(自身,密钥):
    612尝试:
    -->613返回self.index.get_值(self,key)
    614除InvalidIndex错误外:
    615通行证
    //获取_值(self、series、key)中的anaconda/lib/python2.7/site-packages/pandas/core/index.pyc
    761         """
    762尝试:
    -->763返回自引擎。获取值(系列,键)
    764除KeyError外,e1:
    765如果len(self)>0且self.u type=='integer':
    //anaconda/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_值(pandas/index.c:2565)()
    //anaconda/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_值(pandas/index.c:2380)()
    //anaconda/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_loc(pandas/index.c:3166)()
    KeyError:无
    
    问题在于,如果没有有效值,
    第一个有效索引
    将返回None(数据帧中的某些组均为NaN):

    现在,
    loc
    抛出一个错误,因为没有索引
    None

    In [3]: s.loc[s.first_valid_index()]
    KeyError: None
    
    在这种特殊情况下,您希望代码做什么?…
    如果希望它是NaN,可以回填并获取第一个元素:

    g['Focal'].transform(lambda s: s.bfill().iloc[0])
    

    如果要解决某些组仅包含Nan的问题,可以执行以下操作:

  • g=data.groupby('会话')
  • g['Focal'].transform(如果pd.isnull,则lambda s:'No values to aggregate'。all()==True else s.loc[s.first\u valid\u index()
  • df['Focal']=g['Focal'].transform(如果pd.isnull,则lambda s:'No value to aggregate')。all()==True else s.loc[s.first_valid_index()
  • 通过这种方式,当程序找到特定组的所有Nan时,您可以输入“No Values to aggregate”(或任何您想要的值),而不是阻塞执行以返回错误

    希望这有帮助:)


    Federico

    您使用的pandas版本是什么?在0.12中可以正常工作。它不是pandas版本,因为每个命令都与玩具数据一起工作。它必须与我的数据交互,可能缺少数据。您完全正确(请查看我的答案),工作正常的是你的虚拟数据!:)是的。我对这一条评论得很慢,因为我正在处理它。因为焦点ID数据非常重要,我不想保留NAN。我手动检查了数据,发现了几个导致NAN的拼写错误。在修复这些错误并重新加载数据后,我从早期版本中提取了代码伯斯特作品完美
    g['Focal'].transform(lambda s: s.bfill().iloc[0])