Request pandas index and data based framework

I have a Datset that looks like this:

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()

I read it in pandas using

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)

How can I generate a subset of this data frame with all records in April, where the taxon is "Calanus_finmarchicus" or "Gastropoda"

I can query the data structure where the taxon is equal to 'Calanus_finmarchicus' or 'Gastropoda' using

df[(df.taxon == 'Calanus_finmarchicus') | (df.taxon == 'Gastropoda')]

But I have problems with requesting time, something similar in numy might be the following:

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]

Here is a link with a notebook to play an example

+4
source share
4 answers

( ) dataframe.index, , :

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

datetime month:

>>> 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
+5

As others have said, you can use df.index.monthto filter by month, but I also suggest using pandas.Series.isin()to check your taxoncondition:

>>> df[df.taxon.isin(['Calanus_finmarchicus', '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  
+2
source

Use the month attribute of your index:

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

All Articles