本博客内容为唐宇迪老师的人工智能课程的笔记,仅为学习之用,请勿用于其他商业用途。
1、从pandas中取出数据
如果我们想从文件中取第一行数据,可以使用loc方法。要注意的是,loc后面跟着的不是小括号而是中括号,操作如下:
print(food_info.loc[0])
#结果如下:
NDB_No 1001
Shrt_Desc BUTTER WITH SALT
Water_(g) 15.87
Energ_Kcal 717
Protein_(g) 0.85
Lipid_Tot_(g) 81.11
Ash_(g) 2.11
Carbohydrt_(g) 0.06
Fiber_TD_(g) 0
Sugar_Tot_(g) 0.06
Calcium_(mg) 24
Iron_(mg) 0.02
Magnesium_(mg) 2
Phosphorus_(mg) 24
Potassium_(mg) 24
Sodium_(mg) 643
Zinc_(mg) 0.09
Copper_(mg) 0
Manganese_(mg) 0
Selenium_(mcg) 1
Vit_C_(mg) 0
Thiamin_(mg) 0.005
Riboflavin_(mg) 0.034
Niacin_(mg) 0.042
Vit_B6_(mg) 0.003
Vit_B12_(mcg) 0.17
Vit_A_IU 2499
Vit_A_RAE 684
Vit_E_(mg) 2.32
Vit_D_mcg 1.5
Vit_D_IU 60
Vit_K_(mcg) 7
FA_Sat_(g) 51.368
FA_Mono_(g) 21.021
FA_Poly_(g) 3.043
Cholestrl_(mg) 215
Name: 0, dtype: object
嗯,这次python很实在地把所有数据都打印出来了……
2、通过切片的方法取出数据
print(food_info.loc[0:2])
#结果如下:
NDB_No Shrt_Desc ... FA_Poly_(g) Cholestrl_(mg)
0 1001 BUTTER WITH SALT ... 3.043 215.0
1 1002 BUTTER WHIPPED WITH SALT ... 3.012 219.0
2 1003 BUTTER OIL ANHYDROUS ... 3.694 256.0
[3 rows x 36 columns]
需要注意的是,不同于python列表切片,pandas中使用loc切片,如果切片范围为[0:2],那么可以取出前三行。
3、通过列取数据
我们通过给NDB_No这一列赋值,来取这一列的数据:
ndb_col = food_info["NDB_No"]
print(ndb_col)
#结果
0 1001
1 1002
2 1003
3 1004
4 1005
...
8613 83110
8614 90240
8615 90480
8616 90560
8617 93600
Name: NDB_No, Length: 8618, dtype: int64
如果定位2列,可以采用如下操作:
columns = ["Zinc_(mg)", "Copper_(mg)"]
zinc_copper = food_info[columns]
print(zinc_copper)
#结果
Zinc_(mg) Copper_(mg)
0 0.09 0.000
1 0.05 0.016
2 0.01 0.001
3 2.66 0.040
4 2.60 0.024
... ... ...
8613 1.10 0.100
8614 1.55 0.033
8615 0.19 0.020
8616 1.00 0.400
8617 1.00 0.250
[8618 rows x 2 columns]
这里需要注意的是,如果我们直接将 food_info["Zinc_(mg)", "Copper_(mg)"]赋值给zinc_copper,在打印的时候会报错!如果直接赋值,需要写成以下的格式:
zinc_copper = food_info[["Zinc_(mg)", "Copper_(mg)"]]
print(zinc_copper)
#结果
Zinc_(mg) Copper_(mg)
0 0.09 0.000
1 0.05 0.016
2 0.01 0.001
3 2.66 0.040
4 2.60 0.024
... ... ...
8613 1.10 0.100
8614 1.55 0.033
8615 0.19 0.020
8616 1.00 0.400
8617 1.00 0.250
[8618 rows x 2 columns]
3、数据的查找
我们可以发现,文件中有些指标以“g”为单位,有点则以“mg”为单位,如果我们希望查找哪些以g为单位,哪些以mg为单位,可以如下操作:
col_names = food_info.columns.tolist()
gram_columns = []
for c in col_names:
if c.endswith("(g)"):
gram_columns.append(c)
gram_df = food_info[gram_columns]
print(gram_df.head(3))
#结果
Water_(g) Protein_(g) Lipid_Tot_(g) ... FA_Sat_(g) FA_Mono_(g) FA_Poly_(g)
0 15.87 0.85 81.11 ... 51.368 21.021 3.043
1 15.87 0.85 81.11 ... 50.489 23.426 3.012
2 0.24 0.28 99.48 ... 61.924 28.732 3.694
[3 rows x 10 columns]
首先,通过tolist()方法返回所有列的列名(返回结果为一个列表),然后在列表中循环,使用endswith()方法,如果以“(g)”为结尾,则添加到gram_columns列表中。
4、在pandas中进行四则运算
如果我们想把Iron_(mg)这一列的单位变为g,则需要除以1000,可以采用如下操作:
print(food_info["Iron_(mg)"])
div_1000 = food_info["Iron_(mg)"]/1000
print(div_1000)
#结果
0 0.02
1 0.16
2 0.00
3 0.31
4 0.43
...
8613 1.40
8614 0.58
8615 3.60
8616 3.50
8617 1.40
Name: Iron_(mg), Length: 8618, dtype: float64
0 0.00002
1 0.00016
2 0.00000
3 0.00031
4 0.00043
...
8613 0.00140
8614 0.00058
8615 0.00360
8616 0.00350
8617 0.00140
Name: Iron_(mg), Length: 8618, dtype: float64
如果我们将pandas中两列数据进行相乘,则pandas会对两列对应位置的数据进行相乘。
5、在pandas中增加列
print(food_info.shape)
iron_grams = food_info["Iron_(mg)"] / 1000
food_info["Iron_(g)"] = iron_grams
print(food_info.shape)
#结果
(8618, 36)
(8618, 37)
可以看到,原文件共有36列,我们将Iron单位由mg变为g后又增加了一列,现在文件共37列。
注意pandas中增加列的方法。