数据处理
创建数据
pd.Series(5,index['A']) # 创建一维数据,索引 自行定义,否则默认从0开始,值 自行定义为5
0 5 # 输出结果
dtype: int64 # 数据类型对象:
pd.Series(5,index=list('abcdef')) # 根据索引值自动生成增加元素
a 5
b 5
c 5
d 5
e 5
f 5
dtype: int64
b=[1]
pd.Series(b,index=list('abcdef')) # 索引值与元素个数不对应
ValueError: Length of passed values is 1, index implies 6. # 报错
a={
'name':['XA','XB','XC'],'age':[8,9,8]}
pd.DataFrame(data=a,index=list('abd')) # 创建二维数据,索引 自行定义,否则默认从0开始,字典中键自动生成为列名
用列表构建二维数据
b=[[1,2,3,4],['a','b','c','d']] # 列表中数据自动变成每行数据
pd.DataFrame(b,columns=list('ABCD'),index=list('xy')) #‘columns’用来定义列名,‘index’用来定义行名,b可以写成data=b
读取数据
import pandas as pd
data_url = "https://pai-public-data.oss-cn-beijing.aliyuncs.com/pokemon/pokemon.csv" #python填写路径时,要么使用/,要么使用\\
df = pd.read_csv(data_url) # 读取本地数据时,'data_url'可以直接写成本地文件名
df.head() # 读取数据前5行
df.tail() # 打印数据后5行
df.columns #打印列名,'columns'为列名
df.index #打印行名,'index'为行名
df.shape #打印维度
axis=0 axis=1的理解
1表示横轴,方向从左到右;0表示纵轴,方向从上到;
当axis=1时,数组的变化是横向的,而体现出来的是列的增加或者减少;
舍弃数据
print df.drop(df.columns[1, 2], axis = 1) #舍弃数据前两列
print df.drop(df.columns[[1, 2]], axis = 0) #舍弃数据前两行
增加列
df ['row'] = 1 #需要赋值,且每次只能增加一列
条件筛选
df[(df['weight']<=70)|(df['weight']>=100)]
df.loc[(df['weight']<=70)|(df['weight']>=100)] # 是否加loc,结果相同
df.loc[(df['weight']<=70)|(df['weight']>=100),'flag'] = 'high' # 创建一个新列‘flag’,并将满足条件的行用‘high’填充
df['flag'].value_counts() # 输出这一列中各个元素的总数
df[['day','time']][(df.tip>7)|(df.total_bill>50)] # 假如加入了筛选条件后,我们只关心day和time这两列数据
统计描述
print df.describe() # 描述性统计,只筛选出具有描述性的统计数据
df.info() # info()函数用于打印DataFrame的简要摘要,显示有关DataFrame的信息,包括索引的数据类型dtype和列的数据类型dtype,非空值的数量和内存使用情况
数据处理
df.T # 数据转置
df.sort_values(by='tip') #按tip列升序排序
缺失值
查找缺失值
data.isnull().any() # 缺失值为true,列中只要有true则返回true
data.isnull().all() # 缺失值为true,列中全部为true才返回true
data.isnull().any(axis=1) # 查看各行是否存在空值
data.isnull().any(axis=1).sum() # 含有空值的行数
利用pandas替换缺失值
data.fillna(0) #缺失值用0替换
data.fillna(method='pad') # 用前面的值替换,当第一行有缺失值时,利用向前替换是会失败的
data.fillna(method='backfill') # 用后面的值替换
文本数据
分割数据
df['abilities'].str.split(',').str.get(1) #将文本数据'abilities'这一列按“,”位置分割成几列,并且显示下标为1的列
df['abilities'].str.split(',',expand=True) # 将分割的几列数据按照二维列表的形式展示出来,此时不能继续使用str.get()函数
选取数据
loc只能选取索引的名称,iloc只能选取索引的下标序列
df['abilities'].str[1:3] #选取文本数据'abilities'这一列中某几个位置的字符
df.loc[0] # 只能对行进行索引,选取行名为“0”的数据
df.loc[0:5] # 选取行名为“0-5”(共6行)的数据
df.loc[[1,4,5]] # 选取行名为“1、4、5”(以列表形式写入)的数据
df.loc[[1,4,5],['against_bug']] # 选取行名为“1、4、5”,列名为'against_bug'的数据,都要以列表格式写入
df.iloc[[1,3,5],[2,4]] # 索引,提取不连续行和列的数据,提取的是第1,3,5行,第2,4列的数据
df.iloc[2:4] #选取第2到第3行
df.iloc[0,1] #选取第0行1列的元素
df.iat[3,2] #专门提取某一个数据,这个例子提取的是第三行,第二列数据(默认从0开始算)
索引
df.set_index('abilities') # 将某一列设为索引
df.set_index(keys=['abilities','against_bug'],append=False,drop=False) # 将两元素均设为索引,默认append=False,不包含自然数的索引,若append=True,则索引为3列,包含自然数的索引
切片方式
new_df.loc[(slice(1,100),slice(None),[1.00,0.50]),:] #选取多重索引的二维列表时,要对每一列的索引进行选取,“:”表示显示所有的列
new_df.loc[(slice(1,100),slice(None),[1.00,0.50]),'against_dragon'] # 只显示某一列,输出为series一维列表
idx=pd.IndexSlice
new_df.loc[idx[0:10,:,[1.00,0.50]],:idx['against_dragon']] # “:”表示对某个索引不做限制,“:idx”表示截至到某一列为止