iteritems() в столбце данных

У меня есть набор данных образовательных данных США: проект объединения. Я хочу узнать

  1. Количество строк, в которых зачисление в 9–12 класс (столбец: GRADES_9_12_G) составляет менее 5000
  2. Число строк, в которых регистрируется класс 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)]))
Другие вопросы по тегам