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 时,才丢弃这数据行(列) -
thresh
thresh = 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
方法来筛选特定的值,把要筛选的值写到一个列表里,如alist
alist = [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))
网友评论