【问题标题】:pandas reindexing error while using loc to create a new data frame使用 loc 创建新数据框时熊猫重新索引错误
【发布时间】:2017-01-20 06:59:49
【问题描述】:

关于重新索引有很多问题,我尝试了解决方案,但它们对我的代码不起作用,可能是我出错了,我有一个包含两个变量 patnum(ID)、vrddat(Date) 和我的数据集m 使用以下代码在应用某些条件后获取数据框。

data_3 = data_2.loc[(((data_2.groupby('patnum').first()['vrddat']> datetime.date(2012,1,1)) & 
     (data_2.groupby('patnum').first()['vrddat']> datetime.date(2012,3,31)))),['patnum','vrddat','drug']].reset_index(drop = True)

上面的代码抛出下面的错误。

索引错误

IndexingError:提供了不可对齐的布尔系列键

如何在应用条件后获得一个包含所有变量作为输入数据的新数据框,在上述代码条件中有效,但是当我使用 loc 获取一个包含所有变量的新数据框时,它会引发索引错误,我也使用了 reset_index,但它不起作用。

谢谢。

【问题讨论】:

    标签: python pandas indexing reindex


    【解决方案1】:

    您想在DataFrame data_2 中使用从Series s 创建的掩码进行布尔索引存在问题,因此需要isin 以检查vrddat 列中的值vals

    data_2 = pd.DataFrame({'patnum':[1,2,3,3,1],
                       'vrddat':pd.date_range('2012-01-10', periods=5, freq='1m'),
                       'drug':[7,8,9,7,5],
                       'zzz ':[1,3,5,6,7]})
    
    print (data_2)
       drug  patnum     vrddat  zzz 
    0     7       1 2012-01-31     1
    1     8       2 2012-02-29     3
    2     9       3 2012-03-31     5
    3     7       3 2012-04-30     6
    4     5       1 2012-05-31     7
    

    s = data_2.groupby('patnum')['vrddat'].first()
    print (s)
    patnum
    1   2012-01-31
    2   2012-02-29
    3   2012-03-31
    Name: vrddat, dtype: datetime64[ns]
    
    mask = (s > datetime.date(2012,1,1)) & (s < datetime.date(2012,3,31))
    print (mask)
    patnum
    1     True
    2     True
    3    False
    Name: vrddat, dtype: bool
    
    vals = s[mask]
    print (vals)
    patnum
    1   2012-01-31
    2   2012-02-29
    Name: vrddat, dtype: datetime64[ns]
    

    data_3 = data_2.loc[data_2['vrddat'].isin(vals), ['patnum','vrddat','drug']]
                   .reset_index(drop = True)
    print (data_3)
       patnum     vrddat  drug
    0       1 2012-01-31     7
    1       2 2012-02-29     8
    

    s 的另一个更快的解决方案是drop_duplicates

    s = data_2.drop_duplicates(['patnum'])['vrddat']
    print (s)
    0   2012-01-31
    1   2012-02-29
    2   2012-03-31
    Name: vrddat, dtype: datetime64[ns]
    

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2014-02-10
      • 2013-12-04
      • 2016-01-13
      相关资源
      最近更新 更多