Dataframe
DataFrame 是一种二维的数据结构,非常接近于excel形式。它的竖行称之为columns,横行称之为index,也就是说可以通过 columns和 index 来确定一个元素的位置
构建dataframe
pd.dataframe( columns = ('第一列','第二列','第三列') )
生成空的pandas表
left = pd.DataFrame({'id':[0,1,2],'name':['Tom','Jack','Mary']})
right = pd.DataFrame({'id':[0,1,2],'year':[23,34,34],'parent_id':[1,2,4]})
print(left)
print(right)
数据添加
-
在原数据后添加新行
df.loc['新行名'] = 数据 -
在原数据后添加新列
df['新列名'] = 数据 -
在特定列上添加新列
df.insert(index, '新列名', 数据)
数据清洗
-
有的原始数据中有丢失数据,丢失的时间数据
NaT丢失的数值数据将始终使用NaN,我们在操作数据前需要对数据进行清洗-
当对数据求和时,NA(缺失)值将被视为零
- 如果数据都是NA,则结果将是NA
dataframe.isnull()返回一个是否有丢失的数据的矩阵dataframe.isnull().sum()返回每一列有多少个丢失的数据 ※-
marketing.dropna(axis = 0, how = 'any', thresh=None )返回一个去掉所有 NaN 数据的
dataframe,参数解释:-
axis默认为
axis = 0或者axis = 'index'上下方向运算,删除每个包含 NaN(丢失数据)的数据行axis = 1或者axis = 'columns'左右方向的运算,删除每个包含 NaN(丢失数据)的数据列 -
how默认是
how = 'any',如果数据行或列(根据axis的值)里有任何一个数据是 NaN() 丢弃这数据行(列)how = 'all',只有在数据行或列所有的数据都是 NaN 时,才丢弃这数据行(列) -
threshthresh = n只保留至少包含n个非NaN数据的行或列 如果参数没有被修改就会调用默认参数
# 生成 Dataframe df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'], "toy": [np.nan, 'Batmobile', 'Bullwhip'], "born": [pd.NaT, pd.Timestamp("1940-04-25"), pd.NaT]}) # 默认清洗函数,按上下方向删除数据(删除行),默认只要有 Na值 的行都删除 df.dropna() print(df) # 左右方向删除数据(删除列),(默认)只要有 Na值 的列都删除 df.dropna(axis='columns') #df.dropna(axis=1) print(df) # (默认)按上下方向删除数据(删除行),只有在数据行或列所有的数据都是 Na 时,才丢弃这数据行(列) df.dropna(how='all') print(df) #(默认)清洗函数,按上下方向删除数据(删除行),只有有至少两个非 Na值 数据的行才保留 df.dropna(thresh=2) print(df) ''' 解释下面的代码 df.dropna(axis = 0, how = 'any') df.dropna(axis = 1, how = 'any') df.dropna(axis = 0, how = 'all') df.dropna(axis = 1, how = 'all') ''' -
-
数据截取
dataframe.iloc[]
"integer-location based indexing" 切片函数,返回一个 Series
参数由想截取行和列组成,
逗号前面的截取的是某行,后面截取的是某列
返回的是series 类型
-
整数
e.g.
dataframe.iloc[5]返回dataframe中第五行的数据 -
整数 list 或者 array
e.g.
dataframe.iloc[[4, 3]]. 返回dataframe中第四行和第三行的数据 -
切片(slice)
e.g.
dataframe.iloc[:5]返回dataframe中前五行的数据(第零到第四行,不包括第五行)e.g.
dataframe.iloc[2:5]返回dataframe中第二行到第四行的数据(共三行不包括第五行) -
两个整数
dataframe.iloc[5,4]返回第五行第四个元素的值
-
布尔值 array , 布尔数组长度等于行数)
e.g.
iloc[[True,True,True,False,False,False]]前三行 -
按列切片
e.g.
dataframe.iloc[:,5]返回dataframe中第五列的数据e.g.
dataframe.iloc[:,:5]返回dataframe中前五列的数据(第零到第四列,不包括第五列)e.g.
dataframe.iloc[:,2:5]返回dataframe中第二列到第四列的数据(共三列不包括第五列)e.g.
dataframe.iloc[:5,:3]返回dataframe中前五行,前三列的数据e.g.
dataframe.iloc[:5,[1,9,11]]返回dataframe中前五行,第一、九、十一列的数据
dataframe.log()
数据查询
Dataframe 有很多筛选数据的功能,数据分析往往都是从对原始数据筛选这一步开始
筛选返回的仍然是dataframe类型
索引查询
-
我们想要筛选
directmarketing里'AmountSpent'列数据中大于0的行marketing[ marketing[ 'AmountSpent' ] > 1000 ] -
想要筛选
directmarketing里'AmountSpent'列数据中大于0的前10行marketing[ marketing[ 'AmountSpent' ] > 1000 ][:10] -
判断条件里也可以包括逻辑运算符(& | not )
想要筛选同时满足 directmarketing里
'AmountSpent'列数据中大于1000
'Gender'是'Male'marketing[marketing[ 'AmountSpent' ] > 1000 ) & (marketing['Gender'] == 'Male') ]注意条件判断里面等号是 == 不是一个等号
-
只需要A和B列数据,而D和C列数据都是用于筛选的
想要筛选
'Age'和Gender列数据,筛选条件是'AmountSpent'列数据中大于1000
'OwnHome'是'Own'
marketing[['Age','Gender']][ (marketing['AmountSpent' ] > 1000) & (marketing['OwnHome'] == 'Own')]
-
上面的方法都是通过一个布尔索引完成的,直接用布尔索引筛选
index = (marketing['AmountSpent' ] > 1000) & (marketing['OwnHome'] == 'Own') print(marketing[ index ]) -
使用
insin方法来筛选特定的值,把要筛选的值写到一个列表里,如alistalist = [6,8,12] index = marketing['Catalogs'].isin(alist) print(marketing[index]) -
查询函数
dataframe.query('筛选条件')big_earners = marketing.query("Salary > 90000")
Challenge
Printing select columns and rows
从文件读取数据至 Dataframe,截取目标数据
pd.read_csv()函数和dataframe.iloc[]函数
import pandas as pd
marketing = pd.read_csv('DirectMarketing.csv')
print(marketing.iloc[:10,[2,3,7]])
Value counts
询问用户想找那一列,返回该列的每个唯一值对应的数据个数
input()函数,从dataframe中根据列名抽取 series和series的value_count()函数
import pandas as pd
marketing = pd.read_csv('DirectMarketing.csv')
name = input('Enter a column name: ')
print(marketing[ name ].value_counts())
Slicing
根据索引截取某几行,从第某列到第某列
dataframe.iloc[]函数
import pandas as pd
marketing = pd.read_excel('DirectMarketing.xlsx')
print(marketing.iloc[[3,42,67,101],:8])
Query
Outputs the Salary, Catalogs and AmountSpent of the first 10 people where their AmountSpent is less than 1000.
筛选数据中的Salary, Catalogs 和 AmountSpent 列的前10行,条件是AmountSpent 小于 1000
数据筛选
import pandas as pd
marketing = pd.read_excel('DirectMarketing.xlsx')
print(marketing[['Salary','Catalogs','AmountSpent']][marketing.AmountSpent < 1000 ][:10])
Query with input
Ask for a salary and then output the salary of the first 5 people with a salary greater than that specified.
要求用户输入薪水,筛选数据所有列的前5行,条件是薪水比用户输入的多
数据筛选
import pandas as pd
marketing = pd.read_excel('DirectMarketing.xlsx')
#print(marketing)
num = int(input('Enter a Salary: '))
s = marketing[['Salary']][marketing.Salary > num][:5]['Salary']
print(s)
Adding a new column
loads in the Excel file AmountSpent_13to17.xlsx and add in a column called ' Difference' which contains the amount spent in 2017 - amount spend in 2013. You should print out the first 5 lines (lines 0 - 4 inclusive).
读取文件,在表后面添加一列,并取前五行
在原数据后添加新列df['新列名'] = 数据,因为输出结果是dataframe 因此用df.head(5) 而不是截取函数
import pandas as pd
spent = pd.read_excel('AmountSpent_13to17.xlsx')
spent['Difference'] = spent['2017']-spent['2013']
print(spent.head(5))