数据框列中的 iteritems()
iteritems() in dataframe column
我有一个 U.S 的数据集。教育数据集:统一项目。我想知道
- 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
对于 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 的设计目的。
我有一个 U.S 的数据集。教育数据集:统一项目。我想知道
- 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
对于 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 的设计目的。