数据框列中的 iteritems()

iteritems() in dataframe column

我有一个 U.S 的数据集。教育数据集:统一项目。我想知道

  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

对于 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)]))

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

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 函数 return returned 的长度,输出 184。这本质上是一个布尔掩码过程,returns 满足 df 的所有 True 值你给的条件。

第二次查询df.loc[(df['GRADES_9_12_G'] > 10000) & (df['GRADES_9_12_G'] < 20000)] 使用 & 运算符,它是一个按位运算符,需要满足两个条件才能对行进行 returned。然后我们也调用 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

为什么我更改了答案中的代码而不是使用您的代码?

简单的说,就是比较pandonic。在可能的情况下,使用 pandas 内置函数比使用 for 循环迭代数据帧更干净,因为这是 pandas 的设计目的。