利用Python进行数据分析的笔记-实战USDA食品数据库

本案例是利用书中的示例
美国农业部(USDA)制作了一份有关食物营养信息的数据库。这边提供一个JSON格式的文件 foods-2011-10-03.json
https://github.com/re4lfl0w/ipython/blob/master/books/python_data_analysis/ch07/foods-2011-10-03.json

这边代码运行的环境是Jupyter Notebook with Python2.7

#coding:utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
import re
import json
%matplotlib inline #在juypter notebook 内嵌图形

db = json.load(open('foods-2011-10-03.json'))
#db[:1]
#len(db)
#type(db)
#db[0].keys()
#db[0]['nutrients'][0]
#len(db[0]['nutrients'])
#nutrients

info_keys = ['description','group','id','manufacturer','tags'] #自定义列名
info = DataFrame(db, columns=info_keys)
info.drop('tags',axis=1,inplace=True) #删除tags一列
pd.value_counts(info.group) #根据group列做统计
pd.value_counts(nutrients.group) #根据group列做统计

Nutrients = [] #新建一个空列表
#取特定key为nutrients id 生成一个list
for rec in db:
    fnuts = DataFrame(rec['nutrients'])
    fnuts['id'] = rec['id']
    Nutrients.append(fnuts)

#Nutrients[:10]

Nutrients = pd.concat(Nutrients,ignore_index=True) #将list中的成员整合到一个DataFrame

#Nutrients[:10]
len(Nutrients)

Nutrients.duplicated().sum() #统计重复项,默认是根据第一列nutrients 统计
Nutrients.duplicated('group').sum()  #统计重复项,根据指定group列统计

Nutrients_with_no_duplicates = Nutrients.drop_duplicates() #丢弃重复项
len(Nutrients_with_no_duplicates)

#两个DataFrame 都有"group"、"description"列名重命名
col_mapping = {'description':'food','group':'fgroup'}
info = info.rename(columns=col_mapping,copy=False) 
col_mapping = {'description':'nutrients','group':'nutgroup'}
Nutrients = Nutrients.rename(columns=col_mapping,copy=False)

#合并2个DataFrame 根据id关联 outer外连接
ndata = pd.merge(Nutrients,info,on='id',how='outer')
ndata.iloc[3000] #等同于ndata.ix[3000] 或者ndata.loc[3000]

#根据营养分类得到锌的中位值
result = ndata.groupby(['nutrients','fgroup'])['value'].quantile(0.5)
#result.head()
result['Zinc, Zn'].sort_values().plot(kind='barh')

#营养成分最为丰富的食物
by_nutrients = ndata.groupby(['nutgroup','nutrients'])
get_maximum = lambda x: x.xs(x.value.idxmax())
get_minimum = lambda x: x.xs(x.value.idxmin())
max_food = by_nutrients.apply(get_maximum)[['value','food']]
 
max_food.food = max_food.food.str[:10]
max_food.loc['Amino Acids']['food']
利用Python进行数据分析的笔记-实战USDA食品数据库_第1张图片
image.png
利用Python进行数据分析的笔记-实战USDA食品数据库_第2张图片
image.png

你可能感兴趣的:(利用Python进行数据分析的笔记-实战USDA食品数据库)