DATAQUEST——Pandas and NumPy Fund
2018.9.26——2018.10.22
-
Introduction To NumPy
1.常规操作是先用 csv模块读取文件,然后list之使其变成list of list的格式,最后再用np.array将其转化
总而言之,就是先用csv模块读取
f = open("nyc_taxis.csv", "r")
taxi_list = list(csv.reader(f))
处理一下,去除第一项的标题项
taxi_list = taxi_list[1:]
将全部value转化为float
converted_taxi_list = []
for row in taxi_list:
—converted_row = []
—for item in row:
——converted_row.append(float(item))
—converted_taxi_list.append(converted_row)
然后用np.array处理之
taxi = np.array(converted_taxi_list)
2.可以使用taxi.shape来查看其中的结构
输出会类似(100,20),意思是说在第一个dimension有100个数值,即100行,20列。
3.taxi[:5]注意一下这是选取前五行
4. image.png 5. image.png6.同维度的array之间可以加减乘除
trip_length_hours = trip_length_seconds / 3600
trip_mph = trip_distance_miles / trip_length_hours
除了直接用除法/,numpy包也可以使用np.divide功能来实现同样的操作
trip_mph_2 = np.divide(trip_distance_miles,trip_length_hours)
7.function与method的对比
最小值
np.min(trip_mph) VS trip_mph.min()
最大值
np.max(trip_mph) VS trip_mph.max()
平均值
np.mean(trip_mph) VS trip_mph.mean()
中位数
np.median(trip_mph)
8.如果是个2d ndarrary
ndarrary.max()输出的只是其中数值最大的一个数
ndarrary.max(axis = 1)会输出每一行最大的数组成列,同理如果axis = 0,就会输出每一列最大的数组成一行
9.如果要在arrary上加一行或者一列应该如何做?
首先要查看俩arrary的结构是否相匹配,print(arrary.shape)
例如如果是(2, 3)与(3,)就不行,前者是二维arrary,后者是一维,所以要先把后者转化成二维
np.expand_dims(zeros,axis=0)因为是将一维转化为二维且形式是行,所以axis = 0
此时一维的(3,)就变成了二维的(1,3)
然后combined = np.concatenate([ones,zeros_2d],axis=0)其中np.concatenate(),中括号内为相合并的两个array,因为是行合并,所以axis = 0
10.有关排序
对于某一个[X, X, X, X]使用np.argsort可将其排序(按数字大小或者开头字母顺序),输出得到的是序列号,例如如果是[2,3,1]排序后输出的就是[2, 0, 1],因为1应该排在第一位,但是却排在了最后,所以排序后的序列号第一个就是1的位置,然后是2的位置,3的位置这样。
sorted_order = np.argsort(last_column)
然后按一下方法可以输出排序后[X, X, X, X]是什么样子的
last_column_sorted = last_column[sorted_order]
最后就可以根据那一行/一列的排序来使原始整个array都发生了行/列的顺序替换
int_square_sorted = int_square[sorted_order]
-
Boolean Indexing With NumPy
1.读取csv文件,间隔符是逗号,去除首行标题(注意一下去除首行标题skip_header=1而不是0)
taxi = np.genfromtxt('nyc_taxis.csv', delimiter=',', skip_header=1)
2.布尔与arrary
输入np.array([2,4,6,8]) < 5
输出array([ True, True, False, False], dtype=bool)
每个element会单独检验一次会不会小于5
此外数组直接计算也是可以的
输入np.array([2,4,6,8]) + 10
输出array([12, 14, 16, 18])
3.新的套路
查询一个一位数组中=1的分别是哪些
january_bool = pickup_month == 1(得到的是一个布尔数组)
再选出数组中值为1的element
january = pickup_month[january_bool]
最后计算一下值为1的element有多少个????
january_rides = january.shape[0]????
4.ndarray.copy()修改复制数组,对原数组没有影响
如taxi_modified = taxi.copy()
5.c[c[:,1] > 2, 1] = 99
如果第二列有大于2的数,那么那个数就变成99
-
Introduction To Pandas
import pandas as pd
1.导入数据,格式为dataframe(此处指定第一列为行标题)
f500 = pd.read_csv("f500.csv", index_col=0)
f500.index.name = None 因为原数据中,第一列(现在作为行标题)原本应该也是有自己的标题的,这里就是比如company:X1,X2....现在X1 X2都是作为每一行的标题了,这里就是将company删去
2.f500_type = type(f500)查看数据类型,比如此处就是dataframe
f500_shape = f500.shape查看这个数据类型是几行几列,比如(500,16)就是500行16列
4.label selection methods 汇总
image.png
5.选取前n行
df.head(n)
6.选取哪几行哪几列
big_movers = f500.loc[["row1", "row2"], ["column1", "column2"]]
7.pandas包中的describe()function,参照R中的summary类似
profits_desc = f500["profits"].describe()一个dataframe中的一列的总结
revenue_and_employees_desc = f500[["revenues", "employees"]].describe()一个dataframe中的两列的总结
all_desc = f500.describe(include="all")整个dataframe的是总结
8.按dataframe中的series计数,比如此处就是计算各个country出现的次数,顺序是从多到少
top5_countries = f500['country'].value_counts()
top5_countries = f500['country'].value_counts().head(10)更进一步为前十个,如果head括号内不填则默认为前五个
9.找出每一列的最大值,括号内规定只作用于数值型变量
max_f500 = f500.max(numeric_only=True)
类似的还有:
Series.max() and DataFrame.max()
Series.min() and DataFrame.min()
Series.mean() and DataFrame.mean()
Series.median() and DataFrame.median()
Series.mode() and DataFrame.mode()
Series.sum() and DataFrame.sum()
10.dataframe中数的替换
f500.loc["Dow Chemical","ceo"] = "Jim Fitterling"
其中f500是dataframe,"Dow Chemical"是第一列company中其中的一个公司,而ceo是那一行对应的后面某一列,这里是将f500中,第一列Dow Chemical公司的ceo改成"Jim Fitterling"
11.有关于布尔array
以下是dataframe和series之间的区别,可以看到dataframe是展示出所有列,而series只会展示出选中的列
image.png
image.png
12.关于布尔的栗子
kr_bool = f500["country"] == "South Korea"
top_5_kr = f500[kr_bool].head()展示前五个
13.Series.value_counts()中可以加入dropna=False,意义是将NaN也计算进去(默认是跳过的)
栗子f500["previous_rank"].value_counts(dropna=False)
14.以下步骤就是将NaN值替换为0的过程
import numpy as np
prev_rank_before = f500["previous_rank"].value_counts(dropna=False).head()将空值也计算进去
f500.loc[f500["previous_rank"] == 0, "previous_rank"] = np.nan将空值替换为0
prev_rank_after = f500["previous_rank"].value_counts(dropna=False).head()
15.问题:Create a series, cities_usa, containing counts of the five most common Headquarter Location cities for companies headquartered in the USA.
解决:cities_usa = f500.hq_location[f500["country"] == "USA"].value_counts().head()
-
Exploring Data With Pandas
- 对比一下numpy和pandas
- 在numpy中,格式是数组,array
ndarray[2, 0]选取的是第三行的第一个数
ndarray[1]选取的是第二行 - 在pandas中,因为有loc,且格式时dataframe,所以:
df.loc["z", "A"]定位行标签为"z",列标签为"A"
df.loc["y"]定位行标签为"y"
2.Series.iloc和Series.loc
Series.iloc[]括号内是根据位置来定位
Series.loc[]括号内是根据行/列标签的名称来定位
3.排序df.sort_values("根据哪一列的列标签", 是否升序)
sorted_emp = f500.sort_values("employees", ascending=False)
4.Series.str.endswith("t")测试这个series中的每一个element是否以t结尾,返回布尔数值
其中,s.str.endswith('t', na=False)括号内的na=False,如果不设置那么遇到np.nan会返回NAN,设置后遇到np.nan就会单纯的返回TRUE/FALSE
同理,类似的还有Series.str.startswith("t"),Series.str.contains("t")
5.pandas中的布尔数值
pandas中 a & b——a and b python中
pandas中 a | b——a or b python中
pandas中 ~a——not a python中
6.关于控制与非空值的选取
Series.isnull()查找null值的位置 df[Series.isnull()]就可以选出df中指定Series均为null值的部分
Series.notnull()查找非null值的位置 同上
7.按条件选取
filter_big_rev_neg_profit = (f500["revenues"] > 100000) & (f500["profits"] < 0)
big_rev_neg_profit = f500[filter_big_rev_neg_profit]
8.选出唯一值
Series.unique()
输出的格式为array
9.eg
countries = f500["country"].unique()
for c in countries:
—selected_rows = f500[f500["country"] == c]
—sorted_rows = selected_rows.sort_values("employees", ascending=False)
—top_employer = sorted_rows.iloc[0]
—employer_name = top_employer["company"]
—top_employer_by_country[c] = employer_name
-
Data Cleaning Basics
1.读取数据csv,此方法读出来是dataframe格式
df = pd.read_csv("filename.csv", encoding="UTF-8")
2.dataframe.info()查看该dataframe的信息
3.关于string的处理
str.strip()去除空格
str.replace(" ",",")用逗号代替空格
str.lower()改成全小写?
def clean_col(col):
—col = col.strip()
—col = col.replace("Operating System", "os")
—col = col.replace(" ","_")
—col = col.replace("(","")
—col = col.replace(")","")
—col = col.lower()
—return col
laptops.columns = [clean_col(c) for c in laptops.columns]
5.pandas.DataFrame.rename重命名
laptops.rename({"ram": "ram_gb"}, axis=1, inplace=True)将列名称ram重命名为ram_gb,其中axis=1代表列,如果是0代表行
6.df.astype()改变格式
laptops["ram"] = laptops["ram"].astype(int)将ram列内的数据替换为Int格式
7.某一列的文本中带有s的element
laptops.loc[laptops["weight"].str.contains('s'), "weight"]
8.进行2次replace替换,再加上.astype还可以继续改变格式
laptops["weight"] = laptops["weight"].str.replace("kgs","").str.replace("kg","")
9.series.describe()相当于R语言中的SUMMARY,提供平均数,计数,四分位数等信息
price_describe = laptops["price_euros"].describe()
10.Series.str.split和R的split类似,默认是切割空格
s.str.split(n=1,expand=True)从前往后切割,My name is 切割为my 和name is
s.str.rsplit(n=1,expand=True)从后往前切割,My name is 切割为my name 和 is
11.找出错误的element,然后改正之
有关Series.map()匹配
x = pd.Series([1,2,3], index=['one', 'two', 'three'])
y = pd.Series(['foo', 'bar', 'baz'], index=[1,2,3])
x.map(y)结果会是
one foo
two bar
three baz
即会以x的key为结果的key,x中的value去找y的key配对,如果是一样的那么结果中对应的key就会输出value,如果x的value在y的key中没有一样的,那么结果中key对应的value就会是错误值NaN
12.去除错误值/空值
pandas.DataFrame.info对于该dataframe会输出一个Summary,对于每一列会告诉你有多少element,有没有空值
DataFrame.isnull()会输出一个布尔向量,告诉这个位置是否空值
laptops.isnull().sum()得到是不是空值的布尔向量后加上SUM可以分类汇总,即每一列有几个空值
DataFrame.dropna()会移除存在NaN的行或者列,方法是在括号内axis=0即为移除NaN缩在行,1为列
13.Series.value_counts()计算每个value的个数,默认不会计算NaN的null值,但是括号内加dropna=False就会统计NaN值数量
14.dataframe.drop去除某一行/列
s = laptops.drop('storage', axis=1,inplace = TRUE/FALSE)其中Inplace为TRUE时会取代原有的df,为FALSE时原来的df不改变
15.输出保存
DataFrame.to_csv()保存为csv格式,括号内可以为""绝对路径
laptops.to_csv('laptops_cleaned.csv',index=False)
-# Guided Project: Exploring Ebay Car Sales Data项目实践
1.读取数据pd.read_csv()
2.阅览数据df.info(),df.head()
3.查看每一列的名称df.columns
4.更换列的名称,df.rename({"column1":"column1x", ......}, axis=1, inplace=TRUE)
5.查看每一列中数值的具体情况,如最大值最小值数量等autos.describe(include='all')
6.根据某一列分类计数autos['seller'].value_counts()
去除其中某几列autos.drop(['seller','offer_type','abtest','gearbox','unrepaired_damage'],axis=1)
7.替换内容和更改类型
autos['price']=autos['price'].astype('str').str.replace('"].unique().shape
某一列的范围选取autos[autos["price_$"].between(6.990000e+02,1.090000e+04)]
9.计数brands_top5 = autos["brand"].value_counts()
提取index名称brand_names = brands_top5.index