🍀
兄dei
,
你的随手一赞,就是对我莫大的鼓励!
🍀
🌺
兄dei
,
每日一赞,
发大财
,
行大运
哦!
🌺
pandas
主要用于做
数据预处理
。pandas底层是基于numpy实现的,因此numpy可能好几行才能实现的功能,pandas可能一行代码就能够搞定!
CSV
:
Comma-Separated Values
是以
逗号
为分隔符的文件,你可以在电脑上用
Excel软件
直接打开
food_info.csv
第一行是title(或 header)
从第二行开始,每一行表示一个样本
每列表示每种食物含有维生素、蛋白质等营养成分的含量,就相当于是样本的
属性 或 特征
我们就把自己的
CSV文件
当作一个
矩阵
或
表格
去理解就可以!
1 使用pandas读取数据
1.1 panda读取csv文件
import pandas
food_info = pandas.read_csv("food_info.csv")
print(type(food_info))
print(food_info.shape)
print(food_info.dtypes)
输出结果:
<class 'pandas.core.frame.DataFrame'>
(8618, 36)
NDB_No int64
Shrt_Desc object
Water_(g) float64
Energ_Kcal int64
Protein_(g) float64
Lipid_Tot_(g) float64
Ash_(g) float64
Carbohydrt_(g) float64
Fiber_TD_(g) float64
Sugar_Tot_(g) float64
Calcium_(mg) float64
Iron_(mg) float64
Magnesium_(mg) float64
Phosphorus_(mg) float64
Potassium_(mg) float64
Sodium_(mg) float64
Zinc_(mg) float64
Copper_(mg) float64
Manganese_(mg) float64
Selenium_(mcg) float64
Vit_C_(mg) float64
Thiamin_(mg) float64
Riboflavin_(mg) float64
Niacin_(mg) float64
Vit_B6_(mg) float64
Vit_B12_(mcg) float64
Vit_A_IU float64
Vit_A_RAE float64
Vit_E_(mg) float64
Vit_D_mcg float64
Vit_D_IU float64
Vit_K_(mcg) float64
FA_Sat_(g) float64
FA_Mono_(g) float64
FA_Poly_(g) float64
Cholestrl_(mg) float64
dtype: object
输出结果分析:
1、read_csv():读取后数据的类型为DateFrame
,可以暂时理解为矩阵
2、shape结果:(8618, 36),表示有8618个样本(不包括第一行的header
),36列,表示每个样本有36个属性/特征
3、print(food_info.dtypes):输出的是每一列
数据的类型
,object类型可以理解为是字符串string类型!
4、最后一个dtype: object
表示是读取的整个数据的数据类型
,我们使用的是dtypes
查看的数据类型,而不是type
1.2 pandas显示读取的csv文件数据的开头几行 head(n)
import pandas
food_info = pandas.read_csv("food_info.csv")
food_info.head()
显示结果如下:
默认food_info.head()是显示前五条数据
也可以自己指定显示多少行数据
注意:从最左边
可以看出,样本的索引是从0开始的
1.3 pandas显示读取的csv文件数据的结尾几行 tail(n)
import pandas
food_info = pandas.read_csv("food_info.csv")
food_info.tail(4)
1.4 获取读取csv文件的头head(样本的属性)和所有样本的shape
import pandas
food_info = pandas.read_csv("food_info.csv")
heads = food_info.columns
print(heads)
print(heads[0:3])
print(list(heads[0:3]))
print(food_info.shape)
输出结果:
1.5 data_info.loc[n]取出指定的样本(第几行数据)
获取样本数据,即第几行数据,是通过样本的索引获取的
样本的索引是从0
开始的
1.5.1 pandas获取指定某一行的数据
在pandas中取出某一行
的数据是通过loc
进行实现的
注意:第一个样本
的索引
是从0
开始的,并不包括开头的title
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info.loc[0])
food_info.loc[8620]
如果索引超过了,就会报错:KeyError
1.5.2 获取指定连续的多行数据
1、如下,是取索引为3-6
的样本数据,使用冒号隔开:
import pandas
food_info = pandas.read_csv("food_info.csv")
food_info.loc[3:6]
2、获取结果如下
1.5.3 获取指定不连续的多行数据
1、对于获取不连续的多行数据,需要传入对应行索引
的列表
,有两种写法:
import pandas
food_info = pandas.read_csv("food_info.csv")
food_info.loc[[2, 5, 10]]
2、获取结果如下
1.5.4 pandas中常见的数据类型
1、pandas中常见的数据类型
object
- 字符串string类型的值
int` - 整型值 integer values
float
- 浮点值 float values
datetime
- 时间值 time values
bool
- 布尔值 Boolean values
2、查看数据的类型使用dtypes
print(food_info.dtypes)
1.6 获取样本的某一列数据(所有样本的某一属性/特征值)
获取pandas的某一列数据,是根据列名
进行获取的
1.6.1 获取指定的某一列数据
1、直接根据列名
获取即可
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info.columns)
ndb_col = food_info["NDB_No"]
print(ndb_col)
2、获取结果如下:
1.6.2 获取指定的多列数据
1、获取指定的多列数据,也是传入一个列名
的列表
即可
import pandas
food_info = pandas.read_csv("food_info.csv")
zinc_copper = food_info[["Zinc_(mg)", "Copper_(mg)"]]
print(zinc_copper)
2、获取结果如下:
1.6.3 过滤出指定的某些列的数据
1、过滤出指定的某些列
的数据
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info.columns)
col_names = food_info.columns.tolist()
col_names = list(food_info.columns)
print(col_names)
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))
2、过滤结果
2 自己定义pandas类型的数据 和 保存pandas数据
2.1 通过字典定义一个DateFrame数据
1、通过字典
定义一个DataFrame的数据
import pandas as pd
data_dict = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=data_dict)
print(df)
print("*"*50)
print(df.dtypes)
2、构造数据结果
2.2 通过numpy的ndarray数组定义一个DataFrame数据
1、通过numpy的ndarray
定义一个DataFrame的数据
import pandas as pd
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
print(df2)
print("*"*50)
print(df2.dtypes)
2、构造数据结果
2.3 把数据保存成csv文件
1、使用to_csv()
把数据保存成CSV文件
有很多参数,自己去参考API吧,我只说一个:
index=True:默认是为True,会把每行的索引也保存下来,但是我们一般保存的CSV文件是不需要保存索引的,直接设置为False吧
import pandas as pd
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
print(df2)
print("*"*50)
print(df2.dtypes)
df2.to_csv("create_data.csv")
2、生成create_data.csv
文件结果
2.4 把数据保存成xlsx文件
1、使用to_excel()
把数据保存成CSV文件
import pandas as pd
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
print(df2)
print("*"*50)
print(df2.dtypes)
df2.to_excel("create_data.xlsx")
to_excel()
还有一些其他参数,例如:df2.to_excel('out.xlsx',sheet_name="sheetname",index=False)
第一个参数是保存文件名,不能为空
sheet_name:设置excel文件脚注
index=False:不将索引写入到文件中,我们一般保存数据是不需要列的索引的
2、生成create_data.xlsx
文件结果
2.5 pandas把数据保存其他更多格式
1、参考
df.to_json():保存成json文件
df.to_html():保存成html文件
3 对pandas的列进行计算等操作
我们已经知道了,pandas中的某一列,就是样本的某一个属性 / 特征
我们需要对列数据
比如做单位转换,比如从单位g转换为mg,多列数据合并生成新的一列数据作为新的特征
3.1 获取某一列的数据进行操作
3.1.1 获取某一列的数据进行操作
1、如下是获取"Iron_(mg)"
这一列的数据,并对该列的数据除以1000的操作
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info["Iron_(mg)"])
div_1000 = food_info["Iron_(mg)"] / 1000
print(div_1000)
print(food_info["Iron_(mg)"])
2、获取结果
3、当然还可以对获取到的某一列数据,进行一些其他你想要进行的任何计算操作
add_100 = food_info["Iron_(mg)"] + 100
sub_100 = food_info["Iron_(mg)"] - 100
mult_2 = food_info["Iron_(mg)"]*2
3.1.2 获取某一列的数据进行操作,并同步修改到整个读取的数据中
1、同步修改数据到整个数据中
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info["Iron_(mg)"])
div_1000 = food_info["Iron_(mg)"] / 1000
print(div_1000)
food_info["Iron_(mg)"] = div_1000
print(food_info["Iron_(mg)"])
2、修改结果如下:
3.2 对某两列数据合并到一起,并添加新的列
3.2.1 对某两列的数据进行计算操作
对某两列的数据进行计算操作,必须保证两列的数据维度是一样的
比如让某两列的数据相乘,就是对应位置的元素值相乘
1、比如我们计算如下的两列数据,让这两列数据相乘
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info.head(3))
water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]
print(water_energy)
2、相乘之后的结果
3.2.2 把某两列进行一定组合,生成新的一列
1、比如,我们认为"Water_(g)"
和"Energ_Kcal"
这两列数据存在一定的联系,可以组合出新的一个特征
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info.head(3))
water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]
iron_grams = food_info["Iron_(mg)"] / 1000
food_info["Iron_(g)"] = iron_grams
print(food_info.head(3))
2、组合后的结果,如下可以看出food_info已经多了一列数据"Iron_(g)"
3.2 对某一列的数据进行归一化操作
从上面的例子,我们只要知道:
怎样拿到某一列的数据
怎样对某一列的数据进行计算
这样我们就可以,对数据进行很多的操作,现在我们再举个例子,如何对某一列的数据进行归一化操作
1、对某一列的数据进行归一化操作
import pandas
food_info = pandas.read_csv("food_info.csv")
max_calories = food_info["Energ_Kcal"].max()
normalized_calories = food_info["Energ_Kcal"] / max_calories
normalized_protein = food_info["Protein_(g)"] / food_info["Protein_(g)"].max()
normalized_fat = food_info["Lipid_Tot_(g)"] / food_info["Lipid_Tot_(g)"].max()
food_info["Normalized_Protein"] = normalized_protein
food_info["Normalized_Fat"] = normalized_fat
3.3 查看计算某一列数据还有哪些常用的API
1、使用dir()函数进行查看
'abs', 'add', 'add_prefix', 'add_suffix', 'agg', 'aggregate', 'align', 'all', 'any', 'append', 'apply', 'argmax',
'argmin', 'argsort', 'array', 'asfreq', 'asof', 'astype', 'at', 'at_time', 'attrs', 'autocorr', 'axes', 'between',
'between_time', 'bfill', 'bool', 'clip', 'combine', 'combine_first', 'convert_dtypes', 'copy', 'corr',
'count', 'cov', 'cummax', 'cummin', 'cumprod', 'cumsum', 'describe', 'diff', 'div', 'divide', 'divmod',
'dot', 'drop', 'drop_duplicates', 'droplevel', 'dropna', 'dtype', 'dtypes', 'duplicated', 'empty', 'eq',
'equals', 'ewm', 'expanding', 'explode', 'factorize', 'ffill', 'fillna', 'filter', 'first', 'first_valid_index',
'floordiv', 'ge', 'get', 'groupby', 'gt', 'hasnans', 'head', 'hist', 'iat', 'idxmax', 'idxmin', 'iloc', 'index',
'infer_objects', 'interpolate', 'is_monotonic', 'is_monotonic_decreasing', 'is_monotonic_increasing',
'is_unique', 'isin', 'isna', 'isnull', 'item', 'items', 'iteritems', 'keys', 'kurt', 'kurtosis', 'last',
'last_valid_index', 'le', 'loc', 'lt', 'mad', 'map', 'mask', 'max', 'mean', 'median', 'memory_usage',
'min', 'mod', 'mode', 'mul', 'multiply', 'name', 'nbytes', 'ndim', 'ne', 'nlargest', 'notna', 'notnull',
'nsmallest', 'nunique', 'pct_change', 'pipe', 'plot', 'pop', 'pow', 'prod', 'product', 'quantile',
'radd', 'rank', 'ravel', 'rdiv', 'rdivmod', 'reindex', 'reindex_like', 'rename', 'rename_axis',
'reorder_levels', 'repeat', 'replace', 'resample', 'reset_index', 'rfloordiv', 'rmod', 'rmul',
'rolling', 'round', 'rpow', 'rsub', 'rtruediv', 'sample', 'searchsorted', 'sem', 'set_axis',
'shape', 'shift', 'size', 'skew', 'slice_shift', 'sort_index', 'sort_values', 'squeeze', 'std', 'sub',
'subtract', 'sum', 'swapaxes', 'swaplevel', 'tail', 'take', 'to_clipboard', 'to_csv', 'to_dict',
'to_excel', 'to_frame', 'to_hdf', 'to_json', 'to_latex', 'to_list', 'to_markdown',
'to_numpy', 'to_period', 'to_pickle', 'to_sql', 'to_string', 'to_timestamp', 'to_xarray',
'transform', 'transpose', 'truediv', 'truncate', 'tshift', 'tz_convert', 'tz_localize',
'unique', 'unstack', 'update', 'value_counts', 'values', 'var', 'view', 'where', 'xs'
3.4 对pandas的某一列数据进行排序
NaN是缺失值,无论是按照升序还是降序盘排列
, NaN值都是排到最后
ascending=False是按照降序排列,即从大到小排列,默认ascending=True是升序排列的(从小到大排列)
1、分别对某一列进行升序和降序排列
import pandas
food_info = pandas.read_csv("food_info.csv")
print(food_info["Sodium_(mg)"])
print("*"*50)
food_info.sort_values("Sodium_(mg)", inplace=True)
print(food_info["Sodium_(mg)"])
print("*"*50)
food_info.sort_values("Sodium_(mg)", inplace=True, ascending=False)
print(food_info["Sodium_(mg)"])
如果要对多列进行排序,也可以传入的第一个参数为多个列名的列表
2、排序结果如下:
4 使用pandas分析泰坦尼克号船员获救数据
1、在开始之前,我们先来介绍一下泰坦尼克号船员获救数据
数据,该数据一共包含891行(rows),12列(columns),即:
一共有891个样本
每个样本有12个属性特征
2、泰坦尼克号船员获救数据
数据的12个列名分别为:
Passengerid:每个人都会有一个这样的编号
Survived:要么是0,要么是1,表示label值,是否获救
Pclass:表示船舱的等级
Name:乘客的名字
Sex:性别
Age:年龄
SibSp:兄弟姐妹的数量
Parch:老人和孩子的数量
Ticket:船票的编码
Fare:船票的价格
Cabin:船舱的编号,当前列缺失值比较多,一般在数据分析的时候也不会用到
Embarked:乘客登船的地点
3、先来查看一下前五行数据
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
titanic_survival.head()
4.1 查看泰坦尼克号数据某一列缺失值NaN的个数
1、获取泰坦尼克号某一列中缺失值的个数
使用pd.is_null()
判断某一列中所有元素是否为缺失值NaN
如果为缺失值,则返回True,否则返回False
缺失值NaN在Execl中是显示为空的
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
age = titanic_survival["Age"]
print(age.loc[0:8])
print("*"*50)
age_is_null = pd.isnull(age)
print(age_is_null[0:8])
print("*"*50)
age_null_true = age[age_is_null]
print(age_null_true)
age_null_count = len(age_null_true)
print(age_null_count)
4.2 求泰坦尼克船员数据年龄的平均值
1、直接计算平均年龄
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
age = titanic_survival["Age"]
mean_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"])
print(mean_age)
2、计算结果为NaN,因此必须先要过滤掉年龄列中的缺失值NaN
4.2.1 先过滤掉年龄列中的缺失值
1、先过滤掉年龄列中的缺失值
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
age = titanic_survival["Age"]
age_is_null = pd.isnull(age)
good_ages = titanic_survival["Age"][age_is_null == False]
print(good_ages)
correct_mean_age = sum(good_ages) / len(good_ages)
print(correct_mean_age)
2、计算结果
4.2.2 通过pandas内置的API直接计算某一列的平均值
1、pandas在计算平均值的时候,会自动过滤掉NaN值
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
age = titanic_survival["Age"]
correct_mean_age = titanic_survival["Age"].mean()
print(correct_mean_age)
2、计算结果
其实,我们在实际处理数据
计算平均值
的时候不一定要把缺失值过滤掉
,而是通过平均值
或中位数
等的方式填充缺失值NaN
4.3 计算每个船舱等级船票的平均价格和平均年龄
4.3.1 通过循环计算实现:计算每个船舱等级船票的平均价格
1、计算每个船舱等级船票的平均价格
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
passenger_classes = [1, 2, 3]
fares_by_class = {}
for this_class in passenger_classes:
pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class]
pclass_fares = pclass_rows["Fare"]
fare_for_class = pclass_fares.mean()
fares_by_class[this_class] = fare_for_class
print(fares_by_class)
2、计算结果
4.3.2 通过pd的内置函数pivot_table():计算每个船舱等级船票的平均价格
1、pivot_table()映射表
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
passenger_age = titanic_survival.pivot_table(index="Pclass", values="Age")
print(passenger_age)
2、计算的结果,可以看到和上面我们通过循环计算的是一致的
4.3.3 通过pd的内置函数pivot_table():计算每个船舱等级中的平均年龄
1、同上面一样
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
passenger_age = titanic_survival.pivot_table(index="Pclass", values="Age")
print(passenger_age)
2、计算结果
默认aggfunc=np.mean
是求均值的操作
4.3.4 计算一个量和其他多个量之间的关系
1、登船地点相当于是三个类别,然后求这个三个类别的两个指标数据的求和
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
port_stats = titanic_survival.pivot_table(index="Embarked", values=["Fare","Survived"], aggfunc=np.sum)
print(port_stats)
2、计算结果
4.4 丢弃含有NaN值的列 或 行
1、使用 dropna()
丢弃含有NaN值的行和列
axis=1 或 axis=columns:丢弃含有NaN值的列
axis=0 :丢弃含有NaN值的行
subset:则表示指定要丢弃的数据
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
drop_na_columns = titanic_survival.dropna(axis=1)
print(drop_na_columns)
print("*"*50)
new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age", "Sex"])
print(new_titanic_survival)
2、结果:
4.5 定位获取到 表格中的某行或某列中的元素
1、获取指定位置的某个值,则需要:
样本的索引
样本的列名
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
row_index_83_age = titanic_survival.loc[83,"Age"]
row_index_1000_pclass = titanic_survival.loc[766,"Pclass"]
print(row_index_83_age)
print(row_index_1000_pclass)
print("*"*50)
row_index_83t0100_age = titanic_survival.loc[83: 100,"Age"]
print(row_index_83t0100_age)
##4.6 对某一列排序之后,再对索引重新排序
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
new_titanic_survival = titanic_survival.sort_values("Age",ascending=False)
print(new_titanic_survival[0:3])
titanic_reindexed = new_titanic_survival.reset_index(drop=True)
print(titanic_reindexed.iloc[0:3])
4.7 定义一个函数,然后使用appley()将其应用到我们的DataFrame数据结构上
1、这个函数是获取每一列的第一百个数据
import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
def hundredth_row(column):
hundredth_item = column.iloc[99]
return hundredth_item
hundredth_row = titanic_survival.apply(hundredth_row)
print(hundredth_row)
5 pandas中的另外一种数据结构Series
上面我们介绍的数据结构都是DataFrame
,我们说DataFrame
可以直接看作是一个矩阵
或表格
类型的数据,那Series
又是什么样的数据呢?
Series
:就相当与是矩阵数据
中的一行 或 一列