Step 2: Intermediate Python And Pandas
A. Numpy相关知识:
>>使用numpy读取csv文件
import numpy
nfl = numpy.genfromtxt("nfl.csv", delimiter=",")
会返回一个numpy的array结果,即numpy.ndarray
class,但是读取进来的好像默认转为float型(不能转换的则变为NAN),除非调节genfromtxt里的参数,如令dtype="U75"。
>>numpy.array()函数返回ndarray对象,ndarray对象的shape性质(ndarray.shape)可以得到一个关于维度的tuple
>>ndarray中各个元素需要是相同的type,查看type用ndarray.dtype
>>注意,在ndarray的操作中,如果限制有多个条件,是用& 和|,而不是常规的and和or(各个条件用()进行封闭):
例: vector = numpy.array([5, 10, 15, 20])
equal_to_ten_and_five = (vector == 10) & (vector == 5)
>>转换ndarray中元素的类型,采用函数ndarray.astype( ),如:vector.astype(float)
>>ndarray其他函数,ndarray.sum() ndarray.mean() ndarray.max() 其中包含参数axis=1表示对每一row运算得列,axis=0表示对每一column运算得到行
>>ndarray综合操作,包含里面元素的选择提取,替换,求和等:
其中world_alcohol大概是这种形式:
即提取world_alcohol中年份为'1986',国家为"Canada'的row,然后对该提取的数据中最后一列不合法的' '元素替换为'0',并进行float转换最后求和
B. Pandas相关知识
>>pandas读取CSV文件的方式,返回一个DataFrame类:
import pandas as pd
info=pd.read_csv("XXX.csv")
>>DataFrame类的几个函数和性质(head,shape):
info_n_rows=info.head(n)
dimisions=info.shape
rows=dimisions[0]
columns=dimisions[1]
column_info=info.columns
shape返回的行数和列数不包含headers信息以及第一列的行数信息,即不含表头只有表中数据的行列。
>>取出DataFrame中某一行则返回一个Series类型
third_row=info.loc[2]
比如取出第三行的数据,注意这里2是真实的下标,即0,1,2所以为第三行;如果真实index为1,2,3...,则上面相当于取第二行
>>取出DataFrame中某几行的数据,返回的则是DataFrame
multi_rows=info.loc[:2]
multi_rows_1=info.loc[[2,3,5]]
第一条语句取出前三行0,1,2的数据,第二条语句取出标记为2,3,5行的数据
注意这里与list切片操作不一样[a:b],是取出从a到b行的数据(a和b反映真实index值),并不是到b-1行;并且loc[]里的参数要么是一个数要么是一个list,不能传入多个参数
>>取出DataFrame中某一列的数据,直接取出某个column值即可,返回的也是Series类型,如:
ndb_col = info["NDB_No"]
>>取出DataFrame中某几列的数据,返回的是DataFrame
zinc_copper =info[["Zinc_(mg)", "Copper_(mg)"]]
>>DataFrame中各元素的类型,DataFrame.dtypes包含有这些情况:
object - for representing string values.
int - for representing integer values.
float - for representing float values.
datetime - for representing time values.
bool - for representing Boolean values.
即与ndarray不同,一个DataFrame中不同column的元素类型可以不同,不用再进行类型转换。
>>可以直接对DataFrame中的数值列进行数值计算,返回的Series,如:
div_1000 = info["Iron_(mg)"] / 1000
>>Series.max()方法返回该Series中的最大元素值
>>DataFrame.sort_values( )方法,传入某个column的名字,根据该column进行排序
info.sort_values("Sodium_(mg)", inplace=True, ascending=False)
>>
pandas.isnull()
传入参数Series,用于判断里面元素哪些是空'NAN'或者None,返回True和False。用于处理数据缺失
>>Series.mean()方法用于求均值
>>注意区别:
test_1=info[:2] #选出0,1行
test_2=info.loc[:2] #选出0,1,2行
test_3=info["Iron(mg)"] #选出"Iron(mg)"列
test_4=info.iloc[:2,:2] #选出区域0,1行和0,1列
test_5=info.loc[:2,["Iron(mg)","Sodium(mg)"]] #选出区域0,1,2行和"Iron(mg)","Sodium(mg)"列
loc的索引是封闭的,且根据真实索引值,可用于选出区域
iloc索引是不封闭的,是根据行列的数值(从0开始)而不是真实值,可用于选出区域
直接索引[ ]是不封闭的,但是不能用于选择区域
>>DataFrame的其他功能,pivot_table:
passenger_class_fares = titanic_survival.pivot_table(index="pclass", values="fare", aggfunc=np.mean)
根据"pclass"列进行groupby,然后排好后对"fare"列进行均值计算
DataFrame.dropna()
方法 用于抛出那些有空的行或列:
new_titanic_survival=titanic_survival.dropna(axis=0,how="any",subset=["age","sex"])
DataFrame.reset_index()
方法,用于重新设置index,默认为从0开始:
titanic_reindexed=new_titanic_survival.reset_index(drop=True)
print(titanic_reindexed.iloc[:5,:3])
DataFrame.apply()
对DataFrame进行函数应用,默认计算每一列,传入axis=1时计算每一行
最后关于使用titanic_survival.csv数据集进行处理的代码总结如下:
import pandas as pd
titanic_survival=pd.read_csv("titanic_survival.csv")
age = titanic_survival["age"]
idx=pandas.isnull(age)
age_null_true=age[idx]
age_null_count=len(age_null_true)
print(age_null_count)
age_is_null = pd.isnull(titanic_survival["age"])
age_not_null=titanic_survival["age"][age_is_null==False]
correct_mean_age=age_not_null.mean()
correct_mean_age = titanic_survival["age"].mean()
correct_mean_fare=titanic_survival["fare"].mean()
passenger_classes = [1, 2, 3]
fares_by_class = {}
for pc in passenger_classes:
rows=titanic_survival["fare"][titanic_survival["pclass"]==pc]
fares_by_class[pc]=rows.mean()
passenger_age = titanic_survival.pivot_table(index="pclass", values="age")
print(passenger_age)
import numpy as np
port_stats=titanic_survival.pivot_table(index="embarked",values=["fare","survived"],aggfunc=np.sum)
print(port_stats)
drop_na_rows = titanic_survival.dropna(axis=0)
drop_na_columns=titanic_survival.dropna(axis=1)
new_titanic_survival=titanic_survival.dropna(axis=0,how="any",subset=["age","sex"])
# We have already sorted new_titanic_survival by age
first_five_rows = new_titanic_survival.iloc[0:5]
first_ten_rows=new_titanic_survival.iloc[0:10]
row_position_fifth=new_titanic_survival.iloc[4]
row_index_25=new_titanic_survival.loc[25]
titanic_reindexed=new_titanic_survival.reset_index(drop=True)
print(titanic_reindexed.iloc[:5,:3])
def count_null(data):
return len(data[pandas.isnull(data)])
column_null_count=titanic_survival.apply(count_null)
def age_info(data):
if data["age"]<18:
return "minor"
elif data["age"]>=18:
return "adult"
else:
return "unknown"
age_labels=titanic_survival.apply(age_info,axis=1)
age_group_survival=titanic_survival.pivot_table(index='age_labels',values="survived",aggfunc=np.mean)