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

#python #dataframe #iteritems

#python #фрейм данных #итерации

Вопрос:

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

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

df выглядит так

 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
  

Комментарии:

1. Во-первых, является value числовым? if value < 5000: Часть кода может не выполняться. То же самое с более поздней elif value < 20000 and value > 10000: частью.

2. В зависимости от того, как выглядит df, это довольно простой вопрос. Можете ли вы показать df?

3. Привет, АКАШ, это не тот способ, которым вы хотите решить эту проблему. В Pandas есть встроенные модули для этого, но нам было бы полезно, если бы вы могли включить свои данные или небольшое подмножество ваших данных, которые могли бы воспроизвести вашу проблему.

4. Для начала вы сбрасываете свои счетчики до нуля на каждой итерации цикла. Но вам, вероятно, вообще не следует использовать цикл, а скорее научиться использовать встроенные модули pandas

5. Я добавил df, спасибо всем.

Ответ №1:

С Pandas использование циклов почти всегда является неправильным. Вы, вероятно, хотите что-то подобное вместо этого:

 print(len(df.loc[df['GRADES_9_12_G'] < 5000]))    
print(len(df.loc[(10000 < df['GRADES_9_12_G']) amp; (df['GRADES_9_12_G'] < 20000)]))
  

Комментарии:

1. Как раз собирался опубликовать то же самое. Приятно!

Ответ №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) amp; (df['GRADES_9_12_G'] < 20000)])) # 52
  

Строка df.loc[df['GRADES_9_12_G'] < 5000] сообщает pandas запрашивать фрейм данных для всех строк в столбце df['GRADES_9_12_G'] , которые меньше 5000. Затем я вызываю встроенную в python функцию len, чтобы вернуть возвращаемую длину, которая выводит 184. По сути, это логический процесс маскирования, который возвращает все True значения для вашего df, которые соответствуют условиям, которые вы ему задаете.

Во втором запросе df.loc[(df['GRADES_9_12_G'] > 10000) amp; (df['GRADES_9_12_G'] < 20000)] используется amp; оператор, который является побитовым оператором, который требует выполнения обоих условий для возврата строки. Затем мы также вызываем функцию 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) amp; (df < 20000)])) # same as above, just for vals in between range
  

Почему я изменил код в своем ответе вместо того, чтобы использовать ваш?

Достаточно просто сказать, что это более пандоническое. Там, где мы можем, удобнее использовать встроенные модули pandas, чем перебирать фреймы данных с циклами for, поскольку именно для этого и был разработан pandas.

Комментарии:

1. Нет проблем, если этого решения было достаточно, пожалуйста, рассмотрите возможность принятия его в качестве ответа, щелкнув галочку под стрелками.