1

我有一个美国教育数据集的数据集:统一项目。我想知道

  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
4

2 回答 2

1

对于 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)]))
于 2019-04-11T21:18:27.817 回答
0

我下载了你的数据集,有多种方法可以解决这个问题。首先,如果您不想,您不需要对数据进行子集化。你的问题可以这样解决:

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]告诉 pandas 查询列df['GRADES_9_12_G']中小于 5000 的所有行的数据帧。然后我调用 python 的内置 len 函数来返回返回的长度,输出 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 的设计目的。

于 2019-04-11T21:19:36.033 回答