pandas 使用 loc 创建新数据框时重新索引错误
pandas reindexing error while using loc to create a new data frame
关于重新索引有很多问题,我尝试了这些解决方案,但它们对我的代码不起作用,可能是我弄错了,我有一个包含两个变量 patnum(ID)、vrddat(Date) 和在应用某些条件后,我使用下面的代码来获取数据框。
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: Unalignable boolean Series key provided
如何在应用条件后获得一个将所有变量作为输入数据的新数据框,在上面的代码中条件有效,但是当我使用 loc 获取一个包含所有变量的新数据框时,它会抛出索引错误,我也使用了 reset_index,但它确实有效。
谢谢。
您希望通过从 Series
s
创建的掩码在 DataFrame
data_2
中使用布尔索引存在问题,因此需要 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]
关于重新索引有很多问题,我尝试了这些解决方案,但它们对我的代码不起作用,可能是我弄错了,我有一个包含两个变量 patnum(ID)、vrddat(Date) 和在应用某些条件后,我使用下面的代码来获取数据框。
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: Unalignable boolean Series key provided
如何在应用条件后获得一个将所有变量作为输入数据的新数据框,在上面的代码中条件有效,但是当我使用 loc 获取一个包含所有变量的新数据框时,它会抛出索引错误,我也使用了 reset_index,但它确实有效。
谢谢。
您希望通过从 Series
s
创建的掩码在 DataFrame
data_2
中使用布尔索引存在问题,因此需要 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]