In [1]:
import pandas as pd
pd.read_csv("surveys.csv")
Out[1]:
record_id
month
day
year
plot_id
species_id
sex
hindfoot_length
weight
0
1
7
16
1977
2
NL
M
32.0
NaN
1
2
7
16
1977
3
NL
M
33.0
NaN
2
3
7
16
1977
2
DM
F
37.0
NaN
3
4
7
16
1977
7
DM
M
36.0
NaN
4
5
7
16
1977
3
DM
M
35.0
NaN
5
6
7
16
1977
1
PF
M
14.0
NaN
6
7
7
16
1977
2
PE
F
NaN
NaN
7
8
7
16
1977
1
DM
M
37.0
NaN
8
9
7
16
1977
1
DM
F
34.0
NaN
9
10
7
16
1977
6
PF
F
20.0
NaN
10
11
7
16
1977
5
DS
F
53.0
NaN
11
12
7
16
1977
7
DM
M
38.0
NaN
12
13
7
16
1977
3
DM
M
35.0
NaN
13
14
7
16
1977
8
DM
NaN
NaN
NaN
14
15
7
16
1977
6
DM
F
36.0
NaN
15
16
7
16
1977
4
DM
F
36.0
NaN
16
17
7
16
1977
3
DS
F
48.0
NaN
17
18
7
16
1977
2
PP
M
22.0
NaN
18
19
7
16
1977
4
PF
NaN
NaN
NaN
19
20
7
17
1977
11
DS
F
48.0
NaN
20
21
7
17
1977
14
DM
F
34.0
NaN
21
22
7
17
1977
15
NL
F
31.0
NaN
22
23
7
17
1977
13
DM
M
36.0
NaN
23
24
7
17
1977
13
SH
M
21.0
NaN
24
25
7
17
1977
9
DM
M
35.0
NaN
25
26
7
17
1977
15
DM
M
31.0
NaN
26
27
7
17
1977
15
DM
M
36.0
NaN
27
28
7
17
1977
11
DM
M
38.0
NaN
28
29
7
17
1977
11
PP
M
NaN
NaN
29
30
7
17
1977
10
DS
F
52.0
NaN
...
...
...
...
...
...
...
...
...
...
35519
35520
12
31
2002
9
SF
NaN
24.0
36.0
35520
35521
12
31
2002
9
DM
M
37.0
48.0
35521
35522
12
31
2002
9
DM
F
35.0
45.0
35522
35523
12
31
2002
9
DM
F
36.0
44.0
35523
35524
12
31
2002
9
PB
F
25.0
27.0
35524
35525
12
31
2002
9
OL
M
21.0
26.0
35525
35526
12
31
2002
8
OT
F
20.0
24.0
35526
35527
12
31
2002
13
DO
F
33.0
43.0
35527
35528
12
31
2002
13
US
NaN
NaN
NaN
35528
35529
12
31
2002
13
PB
F
25.0
25.0
35529
35530
12
31
2002
13
OT
F
20.0
NaN
35530
35531
12
31
2002
13
PB
F
27.0
NaN
35531
35532
12
31
2002
14
DM
F
34.0
43.0
35532
35533
12
31
2002
14
DM
F
36.0
48.0
35533
35534
12
31
2002
14
DM
M
37.0
56.0
35534
35535
12
31
2002
14
DM
M
37.0
53.0
35535
35536
12
31
2002
14
DM
F
35.0
42.0
35536
35537
12
31
2002
14
DM
F
36.0
46.0
35537
35538
12
31
2002
15
PB
F
26.0
31.0
35538
35539
12
31
2002
15
SF
M
26.0
68.0
35539
35540
12
31
2002
15
PB
F
26.0
23.0
35540
35541
12
31
2002
15
PB
F
24.0
31.0
35541
35542
12
31
2002
15
PB
F
26.0
29.0
35542
35543
12
31
2002
15
PB
F
27.0
34.0
35543
35544
12
31
2002
15
US
NaN
NaN
NaN
35544
35545
12
31
2002
15
AH
NaN
NaN
NaN
35545
35546
12
31
2002
15
AH
NaN
NaN
NaN
35546
35547
12
31
2002
10
RM
F
15.0
14.0
35547
35548
12
31
2002
7
DO
M
36.0
51.0
35548
35549
12
31
2002
5
NaN
NaN
NaN
NaN
35549 rows × 9 columns
In [2]:
surveys_df = pd.read_csv("surveys.csv")
surveys_df
Out[2]:
record_id
month
day
year
plot_id
species_id
sex
hindfoot_length
weight
0
1
7
16
1977
2
NL
M
32.0
NaN
1
2
7
16
1977
3
NL
M
33.0
NaN
2
3
7
16
1977
2
DM
F
37.0
NaN
3
4
7
16
1977
7
DM
M
36.0
NaN
4
5
7
16
1977
3
DM
M
35.0
NaN
5
6
7
16
1977
1
PF
M
14.0
NaN
6
7
7
16
1977
2
PE
F
NaN
NaN
7
8
7
16
1977
1
DM
M
37.0
NaN
8
9
7
16
1977
1
DM
F
34.0
NaN
9
10
7
16
1977
6
PF
F
20.0
NaN
10
11
7
16
1977
5
DS
F
53.0
NaN
11
12
7
16
1977
7
DM
M
38.0
NaN
12
13
7
16
1977
3
DM
M
35.0
NaN
13
14
7
16
1977
8
DM
NaN
NaN
NaN
14
15
7
16
1977
6
DM
F
36.0
NaN
15
16
7
16
1977
4
DM
F
36.0
NaN
16
17
7
16
1977
3
DS
F
48.0
NaN
17
18
7
16
1977
2
PP
M
22.0
NaN
18
19
7
16
1977
4
PF
NaN
NaN
NaN
19
20
7
17
1977
11
DS
F
48.0
NaN
20
21
7
17
1977
14
DM
F
34.0
NaN
21
22
7
17
1977
15
NL
F
31.0
NaN
22
23
7
17
1977
13
DM
M
36.0
NaN
23
24
7
17
1977
13
SH
M
21.0
NaN
24
25
7
17
1977
9
DM
M
35.0
NaN
25
26
7
17
1977
15
DM
M
31.0
NaN
26
27
7
17
1977
15
DM
M
36.0
NaN
27
28
7
17
1977
11
DM
M
38.0
NaN
28
29
7
17
1977
11
PP
M
NaN
NaN
29
30
7
17
1977
10
DS
F
52.0
NaN
...
...
...
...
...
...
...
...
...
...
35519
35520
12
31
2002
9
SF
NaN
24.0
36.0
35520
35521
12
31
2002
9
DM
M
37.0
48.0
35521
35522
12
31
2002
9
DM
F
35.0
45.0
35522
35523
12
31
2002
9
DM
F
36.0
44.0
35523
35524
12
31
2002
9
PB
F
25.0
27.0
35524
35525
12
31
2002
9
OL
M
21.0
26.0
35525
35526
12
31
2002
8
OT
F
20.0
24.0
35526
35527
12
31
2002
13
DO
F
33.0
43.0
35527
35528
12
31
2002
13
US
NaN
NaN
NaN
35528
35529
12
31
2002
13
PB
F
25.0
25.0
35529
35530
12
31
2002
13
OT
F
20.0
NaN
35530
35531
12
31
2002
13
PB
F
27.0
NaN
35531
35532
12
31
2002
14
DM
F
34.0
43.0
35532
35533
12
31
2002
14
DM
F
36.0
48.0
35533
35534
12
31
2002
14
DM
M
37.0
56.0
35534
35535
12
31
2002
14
DM
M
37.0
53.0
35535
35536
12
31
2002
14
DM
F
35.0
42.0
35536
35537
12
31
2002
14
DM
F
36.0
46.0
35537
35538
12
31
2002
15
PB
F
26.0
31.0
35538
35539
12
31
2002
15
SF
M
26.0
68.0
35539
35540
12
31
2002
15
PB
F
26.0
23.0
35540
35541
12
31
2002
15
PB
F
24.0
31.0
35541
35542
12
31
2002
15
PB
F
26.0
29.0
35542
35543
12
31
2002
15
PB
F
27.0
34.0
35543
35544
12
31
2002
15
US
NaN
NaN
NaN
35544
35545
12
31
2002
15
AH
NaN
NaN
NaN
35545
35546
12
31
2002
15
AH
NaN
NaN
NaN
35546
35547
12
31
2002
10
RM
F
15.0
14.0
35547
35548
12
31
2002
7
DO
M
36.0
51.0
35548
35549
12
31
2002
5
NaN
NaN
NaN
NaN
35549 rows × 9 columns
In [3]:
type(surveys_df)
Out[3]:
pandas.core.frame.DataFrame
In [4]:
surveys_df.__class__
Out[4]:
pandas.core.frame.DataFrame
In [5]:
surveys_df.dtypes
Out[5]:
record_id int64
month int64
day int64
year int64
plot_id int64
species_id object
sex object
hindfoot_length float64
weight float64
dtype: object
In [6]:
surveys_df.columns.values
Out[6]:
array(['record_id', 'month', 'day', 'year', 'plot_id', 'species_id', 'sex',
'hindfoot_length', 'weight'], dtype=object)
In [7]:
pd.unique(surveys_df['species_id'])
Out[7]:
array(['NL', 'DM', 'PF', 'PE', 'DS', 'PP', 'SH', 'OT', 'DO', 'OX', 'SS',
'OL', 'RM', nan, 'SA', 'PM', 'AH', 'DX', 'AB', 'CB', 'CM', 'CQ',
'RF', 'PC', 'PG', 'PH', 'PU', 'CV', 'UR', 'UP', 'ZL', 'UL', 'CS',
'SC', 'BA', 'SF', 'RO', 'AS', 'SO', 'PI', 'ST', 'CU', 'SU', 'RX',
'PB', 'PL', 'PX', 'CT', 'US'], dtype=object)
In [8]:
surveys_df['weight'].describe()
Out[8]:
count 32283.000000
mean 42.672428
std 36.631259
min 4.000000
25% 20.000000
50% 37.000000
75% 48.000000
max 280.000000
Name: weight, dtype: float64
In [9]:
# Group data by sex
grouped_data = surveys_df.groupby('sex')
In [10]:
# summary statistics for all numeric columns by sex
grouped_data.describe()
# provide the mean for each numeric column by sex
grouped_data.mean()
Out[10]:
record_id
month
day
year
plot_id
hindfoot_length
weight
sex
F
18036.412046
6.583047
16.007138
1990.644997
11.440854
28.836780
42.170555
M
17754.835601
6.392668
16.184286
1990.480401
11.098282
29.709578
42.995379
In [11]:
# count the number of samples by species
species_counts = surveys_df.groupby('species_id')['record_id'].count()
print(species_counts)
species_id
AB 303
AH 437
AS 2
BA 46
CB 50
CM 13
CQ 16
CS 1
CT 1
CU 1
CV 1
DM 10596
DO 3027
DS 2504
DX 40
NL 1252
OL 1006
OT 2249
OX 12
PB 2891
PC 39
PE 1299
PF 1597
PG 8
PH 32
PI 9
PL 36
PM 899
PP 3123
PU 5
PX 6
RF 75
RM 2609
RO 8
RX 2
SA 75
SC 1
SF 43
SH 147
SO 43
SS 248
ST 1
SU 5
UL 4
UP 8
UR 10
US 4
ZL 2
Name: record_id, dtype: int64
In [12]:
# multiply all weight values by 2
surveys_df['weight']*2
Out[12]:
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
15 NaN
16 NaN
17 NaN
18 NaN
19 NaN
20 NaN
21 NaN
22 NaN
23 NaN
24 NaN
25 NaN
26 NaN
27 NaN
28 NaN
29 NaN
...
35519 72.0
35520 96.0
35521 90.0
35522 88.0
35523 54.0
35524 52.0
35525 48.0
35526 86.0
35527 NaN
35528 50.0
35529 NaN
35530 NaN
35531 86.0
35532 96.0
35533 112.0
35534 106.0
35535 84.0
35536 92.0
35537 62.0
35538 136.0
35539 46.0
35540 62.0
35541 58.0
35542 68.0
35543 NaN
35544 NaN
35545 NaN
35546 28.0
35547 102.0
35548 NaN
Name: weight, Length: 35549, dtype: float64
In [13]:
# make sure figures appear inline in Ipython Notebook
%matplotlib inline
# create a quick bar chart
species_counts.plot(kind='bar');
In [14]:
total_count = surveys_df.groupby('plot_id')['record_id'].nunique()
# let's plot that too
total_count.plot(kind='bar');
In [15]:
d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
pd.DataFrame(d)
Out[15]:
one
two
a
1.0
1.0
b
2.0
2.0
c
3.0
3.0
d
NaN
4.0
In [16]:
# plot stacked data so columns 'one' and 'two' are stacked
my_df = pd.DataFrame(d)
my_df.plot(kind='bar',stacked=True,title="The title of my graph")
Out[16]:
<matplotlib.axes._subplots.AxesSubplot at 0x11f297f98>
In [ ]:
Content source: GT-IDEaS/SkillsWorkshop2017
Similar notebooks: