使用loc创建新数据框时,pandas重新索引错误

时间:2017-01-20 06:59:49

标签: python pandas indexing reindex

关于重新编制索引有很多问题,我尝试了解决方案,但他们为我的代码工作,可能是我出错了,我有一个数据集有两个变量patnum(ID),vrddat(Date)和我&# 39; 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

     

IndexingError:提供了无法对齐的布尔系列键

在应用条件后,如何获得将所有变量作为输入数据的新数据框,在上面的代码条件下工作但是当我使用loc来获取包含所有变量的新数据框时#39 ; s抛出索引错误,我也使用了reset_index但是它没有工作。

感谢。

1 个答案:

答案 0 :(得分:0)

您希望通过DataFrame data_2创建的掩码在Series s中使用布尔索引存在问题,因此需要isin列{中的检查值{1}} 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 的另一个更快的解决方案是drop_duplicates

s