Домашнее задание по уроку 4.1

Выполнил Мартысюк Илья.


In [10]:
import pandas as pd
import os.path as path
"""
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
"""


Out[10]:
'\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n%matplotlib inline\n'

Читаем данные из файла.


In [14]:
PATH = '/Users/martysyuk/Documents/Python 3 Coding/Repositorys/PY-3-Learning/homeworks/names/'

names = pd.read_csv(PATH + 'yob1981.txt', names=['Name', 'Gender', 'Count'])
names.head(10)


Out[14]:
Name Gender Count
0 Jennifer F 57043
1 Jessica F 42527
2 Amanda F 34373
3 Sarah F 28171
4 Melissa F 28007
5 Amy F 20344
6 Nicole F 20314
7 Stephanie F 20210
8 Elizabeth F 20171
9 Heather F 17944

Читам данные по полу и количеству более 5000


In [4]:
names.query('Gender=="F" & Count > 5000').head(10)


Out[4]:
Name Gender Count
0 Jennifer F 57043
1 Jessica F 42527
2 Amanda F 34373
3 Sarah F 28171
4 Melissa F 28007
5 Amy F 20344
6 Nicole F 20314
7 Stephanie F 20210
8 Elizabeth F 20171
9 Heather F 17944

Тоже самое но другием методом


In [5]:
names[names.Gender=='M'].head(10)


Out[5]:
Name Gender Count
12186 Michael M 68765
12187 Christopher M 50224
12188 Matthew M 43326
12189 Jason M 41928
12190 David M 40646
12191 Joshua M 39050
12192 James M 38306
12193 John M 34880
12194 Robert M 34393
12195 Daniel M 30990

Записываем данные выборки в файл.


In [6]:
names[names.Gender=='M'].head(10).to_csv(PATH + 'done.txt', index=False)

Сортируем выборку


In [7]:
names.sort_values(by='Count', ascending=False).head(10)


Out[7]:
Name Gender Count
12186 Michael M 68765
0 Jennifer F 57043
12187 Christopher M 50224
12188 Matthew M 43326
1 Jessica F 42527
12189 Jason M 41928
12190 David M 40646
12191 Joshua M 39050
12192 James M 38306
12193 John M 34880

Подсчеты данных - считаем сколько всего родилось мальчиков и девочек


In [8]:
print('Родилось {} мальчиков и {} девочек'.format(
    names[names.Gender=='M'].Count.sum(),
    names[names.Gender=='F'].Count.sum()
))


Родилось 1791101 мальчиков и 1667611 девочек

Собственные функции, apply


In [9]:
def count_to_len(row):
    row.Count = len(row.Name)
    return row
names.apply(count_to_len, axis=1).head(10)


Out[9]:
Name Gender Count
0 Jennifer F 8
1 Jessica F 7
2 Amanda F 6
3 Sarah F 5
4 Melissa F 7
5 Amy F 3
6 Nicole F 6
7 Stephanie F 9
8 Elizabeth F 9
9 Heather F 7

Другие функции

  • count() - подсчет
  • max() - максимальное значение
  • min() - минимальное значение
  • mean() - среднее значение
  • median() - медиана

Объединение и группировка данных


In [10]:
cols = ['Name', 'Gender', 'Count']
marge_on = ['Name', 'Gender']
names_1981 = pd.read_csv(PATH + 'yob1981.txt', names=cols)
names_1985 = pd.read_csv(PATH + 'yob1985.txt', names=cols)
pd.merge(names_1981, names_1985, on=marge_on, suffixes=('_1981', '_1985')).head(10)


Out[10]:
Name Gender Count_1981 Count_1985
0 Jennifer F 57043 42649
1 Jessica F 42527 48343
2 Amanda F 34373 39050
3 Sarah F 28171 24877
4 Melissa F 28007 19957
5 Amy F 20344 14422
6 Nicole F 20314 22963
7 Stephanie F 20210 23239
8 Elizabeth F 20171 20538
9 Heather F 17944 21149

Слияние более 2-х файлов происходить поэтапно. Сначало переменной присваиватеся marge первых двух годов, потом в следующую переменную марджится переменная полученная при первом мардже и еще один файл.


In [11]:
names_1981 = pd.read_csv(PATH + 'yob1981.txt', names=cols)
names_1982 = pd.read_csv(PATH + 'yob1982.txt', names=cols)
names_1983 = pd.read_csv(PATH + 'yob1983.txt', names=cols)
names_81_82 = pd.merge(names_1981, names_1985, on=marge_on, suffixes=('_1981', '_1982')).head(10)
names_81_82_83 = pd.merge(names_81_82, names_1983,on=marge_on).head(10)
names_81_82_83


Out[11]:
Name Gender Count_1981 Count_1982 Count
0 Jennifer F 57043 42649 54336
1 Jessica F 42527 48343 45278
2 Amanda F 34373 39050 33754
3 Sarah F 28171 24877 27229
4 Melissa F 28007 19957 23473
5 Amy F 20344 14422 17095
6 Nicole F 20314 22963 22394
7 Stephanie F 20210 23239 22326
8 Elizabeth F 20171 20538 19838
9 Heather F 17944 21149 20750

Другой способ объединения

Добавляет новые данные в конец уже имеющейся таблицы


In [12]:
names_all = pd.concat([names_1981, names_1982, names_1983], names=['Year', 'Pos'])
names_all


Out[12]:
Name Gender Count
0 Jennifer F 57043
1 Jessica F 42527
2 Amanda F 34373
3 Sarah F 28171
4 Melissa F 28007
5 Amy F 20344
6 Nicole F 20314
7 Stephanie F 20210
8 Elizabeth F 20171
9 Heather F 17944
10 Michelle F 17773
11 Rebecca F 16737
12 Kimberly F 16690
13 Tiffany F 16418
14 Angela F 15917
15 Crystal F 15881
16 Christina F 14393
17 Lisa F 14293
18 Erin F 13855
19 Amber F 13814
20 Laura F 13292
21 Rachel F 12587
22 Kelly F 11880
23 Andrea F 11682
24 April F 11403
25 Sara F 11351
26 Mary F 11041
27 Jamie F 10979
28 Emily F 10801
29 Danielle F 10035
... ... ... ...
19368 Wyndell M 5
19369 Xai M 5
19370 Xaiver M 5
19371 Xue M 5
19372 Yaacov M 5
19373 Yasha M 5
19374 Yates M 5
19375 Yaw M 5
19376 Yer M 5
19377 Yero M 5
19378 Yle M 5
19379 Yoav M 5
19380 Yobani M 5
19381 Yon M 5
19382 Yonathan M 5
19383 Yoshio M 5
19384 Yovan M 5
19385 Yuta M 5
19386 Zacharey M 5
19387 Zacheria M 5
19388 Zahid M 5
19389 Zakaria M 5
19390 Zakery M 5
19391 Zaki M 5
19392 Zbigniew M 5
19393 Zebediah M 5
19394 Zebulan M 5
19395 Zef M 5
19396 Zenas M 5
19397 Zoran M 5

58548 rows × 3 columns

И третий способ


In [13]:
def agg_count(row):
    row.Count = row.Count_1981 + row.Count_1982 + row.Count
    return row
names_81_82_83.apply(agg_count, axis=1).sort_values(by='Count', ascending=False).head(10)


Out[13]:
Name Gender Count_1981 Count_1982 Count
0 Jennifer F 57043 42649 154028
1 Jessica F 42527 48343 136148
2 Amanda F 34373 39050 107177
3 Sarah F 28171 24877 80277
4 Melissa F 28007 19957 71437
7 Stephanie F 20210 23239 65775
6 Nicole F 20314 22963 65671
8 Elizabeth F 20171 20538 60547
9 Heather F 17944 21149 59843
5 Amy F 20344 14422 51861