查询基于索引和数据列的pandas数据帧

epi*_*nio 4 python numpy pandas

我有一个看起来像的Datset:

data="""cruiseid  year  station  month  day  date        lat        lon         depth_w  taxon                        count  
        AA8704    1987  1        04     13   13-APR-87   35.85      -75.48      18       Centropages_typicus          75343  
        AA8704    1987  1        04     13   13-APR-87   35.85      -75.48      18       Gastropoda                   0  
        AA8704    1987  1        04     13   13-APR-87   35.85      -75.48      18       Calanus_finmarchicus         2340   
        AA8704    1987  1        07     13   13-JUL-87   35.85      -75.48      18       Acartia_spp.                 5616   
        AA8704    1987  1        07     13   13-JUL-87   35.85      -75.48      18       Metridia_lucens              468    
        AA8704    1987  1        08     13   13-AUG-87   35.85      -75.48      18       Evadne_spp.                  0      
        AA8704    1987  1        08     13   13-AUG-87   35.85      -75.48      18       Salpa                        0      
        AA8704    1987  1        08     13   13-AUG-87   35.85      -75.48      18       Oithona_spp.                 468    
"""
datafile = open('data.txt','w')
datafile.write(data)
datafile.close()
Run Code Online (Sandbox Code Playgroud)

我把它读成大熊猫:

parse = lambda x: dt.datetime.strptime(x, '%d-%m-%Y')
df = pd.read_csv('data.txt',index_col=0, header=False, parse_dates={"Datetime" : [1,3,4]}, skipinitialspace=True, sep=' ', skiprows=0)
Run Code Online (Sandbox Code Playgroud)

我怎样才能从这个数据框生成一个子集,包含4月份的所有记录,其中的分类是'Calanus_finmarchicus'或'Gastropoda'

我可以查询数据帧,其中taxon等于'Calanus_finmarchicus'或'Gastropoda'使用

df[(df.taxon == 'Calanus_finmarchicus') | (df.taxon == 'Gastropoda')]
Run Code Online (Sandbox Code Playgroud)

但是我很难找到时间,类似numy的东西可能是这样的:

import numpy as np
data = np.genfromtxt('data.txt', dtype=[('cruiseid','S6'), ('year','i4'), ('station','i4'), ('month','i4'), ('day','i4'), ('date','S9'), ('lat','f8'), ('lon','f8'), ('depth_w','i8'), ('taxon','S60'), ('count','i8')], skip_header=1)
selection = [np.where((data['taxon']=='Calanus_finmarchicus') | (data['taxon']=='Gastropoda') & ((data['month']==4) | (data['month']==3)))[0]]
data[selection]
Run Code Online (Sandbox Code Playgroud)

这是与笔记本的链接,以重现该示例

alk*_*lko 5

你可以参考datetimemonth属性:

>>> df.index.month
array([4, 4, 4, 7, 7, 8, 8, 8], dtype=int32)

>>> df[((df.taxon == 'Calanus_finmarchicus') | (df.taxon == 'Gastropoda'))
...        & (df.index.month == 4)]

           cruiseid  station       date    lat    lon  depth_w  \
Datetime
1987-04-13   AA8704        1  13-APR-87  35.85 -75.48       18
1987-04-13   AA8704        1  13-APR-87  35.85 -75.48       18

                           taxon  count  Unnamed: 11
Datetime
1987-04-13            Gastropoda      0          NaN
1987-04-13  Calanus_finmarchicus   2340          NaN
Run Code Online (Sandbox Code Playgroud)


epi*_*nio 0

我没有注意语法(括号顺序)和 dataframe.index 属性,这一行给了我我想要的:

results = df[((df.taxon == 'Calanus_finmarchicus') | (df.taxon == 'Gastropoda')) & (df.index.month==4)]  # [df.index.month==4)]
Run Code Online (Sandbox Code Playgroud)