iteritems() в столбце данных
У меня есть набор данных образовательных данных США: проект объединения. Я хочу узнать
- Количество строк, в которых зачисление в 9–12 класс (столбец: GRADES_9_12_G) составляет менее 5000
- Число строк, в которых регистрируется класс 9–12 (столбец: GRADES_9_12_G), составляет от 10 000 до 20 000.
У меня возникла проблема с обновлением счетчика всякий раз, когда значение в операторе if является правильным.
import pandas as pd
import numpy as np
df = pd.read_csv("C:/Users/akash/Downloads/states_all.csv")
df.shape
df = df.iloc[:, -6]
for key, value in df.iteritems():
count = 0
count1 = 0
if value < 5000:
count += 1
elif value < 20000 and value > 10000:
count1 += 1
print(str(count) + str(count1))
дф выглядит так
0 196386.0
1 30847.0
2 175210.0
3 123113.0
4 1372011.0
5 160299.0
6 126917.0
7 28338.0
8 18173.0
9 511557.0
10 315539.0
11 43882.0
12 66541.0
13 495562.0
14 278161.0
15 138907.0
16 120960.0
17 181786.0
18 196891.0
19 59289.0
20 189795.0
21 230299.0
22 419351.0
23 224426.0
24 129554.0
25 235437.0
26 44449.0
27 79975.0
28 57605.0
29 47999.0
...
1462 NaN
1463 NaN
1464 NaN
1465 NaN
1466 NaN
1467 NaN
1468 NaN
1469 NaN
1470 NaN
1471 NaN
1472 NaN
1473 NaN
1474 NaN
1475 NaN
1476 NaN
1477 NaN
1478 NaN
1479 NaN
1480 NaN
1481 NaN
1482 NaN
1483 NaN
1484 NaN
1485 NaN
1486 NaN
1487 NaN
1488 NaN
1489 NaN
1490 NaN
1491 NaN
Name: GRADES_9_12_G, Length: 1492, dtype: float64
На выходе я получил
00
2 ответа
Я скачал ваш набор данных, и есть несколько способов сделать это. Прежде всего, вам не нужно вводить свои данные, если вы этого не хотите. Ваша проблема может быть решена так:
import pandas as pd
df = pd.read_csv('states_all.csv')
df.fillna(0, inplace=True) # fill NA with 0, not required but nice looking
print(len(df.loc[df['GRADES_9_12_G'] < 5000])) # 184
print(len(df.loc[(df['GRADES_9_12_G'] > 10000) & (df['GRADES_9_12_G'] < 20000)])) # 52
Линия df.loc[df['GRADES_9_12_G'] < 5000]
говорит пандам запросить фрейм данных для всех строк в столбце df['GRADES_9_12_G']
которые меньше 5000. Затем я вызываю встроенную функцию python, чтобы вернуть длину возвращаемого значения, которое выдает 184. Это, по сути, процесс логического маскирования, который возвращает все True
значения для вашего df, которые соответствуют условиям, которые вы ему даете.
Второй запрос df.loc[(df['GRADES_9_12_G'] > 10000) & (df['GRADES_9_12_G'] < 20000)]
использует &
оператор, который является побитовым оператором, который требует, чтобы оба условия были выполнены для строки, которая будет возвращена. Затем мы также вызываем функцию len для получения целочисленного значения числа строк, которое выдает 52.
Чтобы выйти из вашего метода:
import pandas as pd
df = pd.read_csv('states_all.csv')
df.fillna(0, inplace=True) # fill NA with 0, not required but nice looking
df = df.iloc[:, -6] # select all rows for your column -6
print(len(df[df < 5000])) # query your "df" for all values less than 5k and print len
print(len(df[(df > 10000) & (df < 20000)])) # same as above, just for vals in between range
Почему я изменил код в своем ответе вместо того, чтобы использовать ваш?
Проще говоря, это более пандонично. Там, где мы можем, проще использовать встроенные модули pandas, чем перебирать кадры данных с циклами for, поскольку для этого и была разработана pandas.
С Pandas использование петель - почти всегда неправильный путь. Вы, вероятно, хотите что-то вроде этого:
print(len(df.loc[df['GRADES_9_12_G'] < 5000]))
print(len(df.loc[(10000 < df['GRADES_9_12_G']) & (df['GRADES_9_12_G'] < 20000)]))