#python #dataframe #iteritems
#python #фрейм данных #итерации
Вопрос:
У меня есть набор данных образовательных наборов данных США: проект объединения. Я хочу выяснить
- Количество строк, в которых зачисление в 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))
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. Нет проблем, если этого решения было достаточно, пожалуйста, рассмотрите возможность принятия его в качестве ответа, щелкнув галочку под стрелками.