数据清洗和整理
缺失值
#找缺失值 isnull(),notnull()<br>data1.isnull()
#滤除缺失数据(法一和法二等价)<br>data1.dropna()<br>data1[data1.notnull()]<br>data2.dropna(axis=1,how='all')-滤去整行/列<br>
df.dropna(thresh=2)#丢弃含有两个Nan的行
#填充:df.fillna(0)/df.fillna({1:0.9,2:0},inplace=True)<br>df2.fillna(method='ffill')填充和上行相同的<br>df2.fillna(method='ffill',limit=2)#指定行数进行填充<br>
重复数据
data2.duplicated()
data2.drop_duplicates()<br>data2.drop_duplicates([0],keep='last')<br>
数据转换
data3['food'].map(meat)
替换
data.replace([-9999,-1000],[np.nan,0])#替换成多个值(列表)
data.replace({-9999:np.nan,-1000:0})#替换成多个值(字典)
重命名索引
data.rename(index={'Beijing':'a','Tokyo':'B','New York':'c'},columns={'one':'第一年'})
tran=lambda x:x[:4].upper()<br>data.index.map(tran)
面元划分
cats=pd.cut(ages,bin)cats2=pd.cut(ages,bin,right=False)
cats.categories 标签
pd.value_counts(cats) 划分并且统计数量
names=['青年','年轻人','中年','老年']<br>cats3=pd.cut(ages,bin,labels=names) 自定义区间划分呢
pd.cut(data,4,precision=2)#指定面元数
cat=pd.qcut(ages,4)<br>pd.value_counts(cat)cut划分是各区间数量不同,而qcut则根据区间长度将数量成比例划分<br>
异常值过滤
假设把绝对值为3以上的数视为异常值
df1[(np.abs(df1)>3).any(1)]
排列与随机采样
sam=np.random.permutation(2)<br>df.take(sam)
df.sample(3)<br>df1.sample(10,replace=True)-replace允许重复抽样<br>
字符串操作
val.split(',')
p=[x.strip() for x in val.split(',')] 去除空白
'::'.join(p)
'c'in P
val.find(',')
val.replace(',','')
val.count(',')
val.endwith/val.startwith
val.upper()/val.lower()
data.str.split('@') 矢量化
正则表达式
res=re.compile('\s+')编译<br>res.split(text)
数据连接
print(pd.merge(left,right,how='left',on=['key'],suffixes=('_left','_right')))
pd.merge(left2,right2,how='outer',left_index=True,right_index=True)
left2.join(right2,how='outer')
pd.concat([df1,df2],axis=1,join='inner')
重塑层次化索引<br>
列索引转换为行索引,(DataFrame->Series)<br>r=data.stack() 默认过滤缺失值
unstack() 默认转换的层级为level=1,可指定层级<br>r.unstack()
轴向旋转
df3.pivot('date','class','values')
分组与聚合
分组r=df1.groupby(by='fruit')<br>for i in r:<br>print(i)<br><br>for name,group in r:<br>print(name)#输出组名<br>print(group)#输出数据块(数据块是dataframe类型)<br><br>dict(list(df1.groupby(by='fruit')))['apple']选择任一数据快<br>
多条件分组df1.groupby(by=['fruit','color'])['price'].mean()<br>#备:如果要把type变为DataFrame,则在['price']增加一个中括号<br>df1.groupby(by=['fruit','color'])[['price']].mean()
聚合df1.groupby(by='fruit')['price'].mean()<br><br>#count,sum,mean,median,std,var,min,max,prod,first,last(非NAN值的第一个和最后一个)<br>#以上函数都表示非NAN值的部分<br>
自定义聚合函数<br>def diff(arr):<br>return arr.max()-arr.min()<br><br>df1.groupby('fruit')['price'].agg(diff)<br>
计算
NAN视为0,如果不忽略NAN,那么指定skipna为False<br>print(df.sum(axis=1,skipna=False))
df.idxmax()-该列最大值对应的索引
df.cumsum()-累计求和
df.describe()-描述
函数应用
apply:df.apply(f,axis=1)-函数应用到列或者行
applymap:df.applymap(f2)-函数应用到每个数据上
sort_index:data1.sort_index(axis=1,ascending=False)-索引排序
s1.sort_values(axis=1,ascending=False)-值排序<br>data2.sort_values(by='a',axis=1,ascending=False)-根据指定列排序<br>
uni1=data3.unique()-唯一值
data3.value_counts()#统计重复出现的次数
data4.index.is_unique-判断索引是否唯一<br>
data3.isin([5])-判断成员是否存在
缺失值
判断:isnull();丢弃:dropna();填充:fillna()
索引操作
重新索引
#行重新索引<br>d2=d1.reindex([0,1,2,3])<br>print(d2)<br>#列重新索引<br>d3=d1.reindex(columns=[0,1,2,3,4])<br>
增删
增
下标增加:e1[1]=999 增加的是列,且会改变原表
append:e2=s0.append(s1) 对Series增加,对列增加,不改变原表
insert:e1.insert(0,'M',[8,88,888]) 对DataFrame增加, insert(插入列的位置,插入列的名称,插入列的数值)
loc :e1.loc['d']=[100,1000,100001,100000,2000,200000,1,11] 对行的插入
append:对行增加;row={'e':20,'A':30,'B':20,'C':100,'D':19,1:100}<br>e2=e1.append(row,ignore_index=True)
删除
下标删除:del e2['A'] 对原对象产生影响,并且默认删除列
drop:e2.drop(1)/e2.drop('B',axis=1)#axis=1表示列,0表示行,且1可用'columns'代替.不对原对象产生影响。若要在原对象上删除,则增加参数inplace=True
高级索引
标签索引 loc s2.loc['apple':'banana','a':'b']#第一个参数索引行,第二个参数索引列
位置索引 iloc s2.iloc[0:2,1:2]
层级索引
交换:s1.swaplevel()
#选取<br><br>#外层选取<br><br>s1['b']<br><br>#内层-选取内层索引为2的<br><br>s1[:,2]<br><br>#选取具体的<br><br>s1['a',0]<br><br>
交换并排序:s1.swaplevel().sortlevel()
DataFrame创建
字典类
#列表,元祖或数组组成字典构建DataFrame<br><br>a={'a':[1,2,3],<br><br>'b':[4,5,6],<br><br>'c':[9,4,3]}<br><br>b=pd.DataFrame(a)
#根据Series创建DataFrame<br><br>pd1=pd.DataFrame({'a':pd.Series(np.arange(10)),<br><br>'b':pd.Series(np.arange(1,6))})
#根据字典创建DataFrame<br>data2={'a':{'apple':3.6,'banana':5.6},<br><br>'b':{'apple2':2.3,'banana2':6.5}}<br><br>pd2=pd.DataFrame(data2)<br>
列表类
#2D ndarray构造列表
arr1=np.arange(24).reshape(4,6)
list1=pd.DataFrame(arr1)
##字典构成的列表构造<br>list2=[{'apple':2.3,'banana':4.4},<br><br>{'apple':1.2,'banana':4.1},<br><br>{'apple':5.3,'banana':2.4}]<br><br>pd2=pd.DataFrame(list2)<br><br>pd2#注意与以列表构成的字典相互区分。一个KEY是作为行索引,一个作为列索引<br>
#Series构成的列表构造<br><br>list3=[pd.Series(np.random.rand(3)),<br><br>pd.Series(np.random.rand(2))]<br><br>pd3=pd.DataFrame(list3)
读写文件
索引和列的转换
列作为行索引 info_csv3=pd.read_csv('filepython1.csv',index_col='message')
写
info1.to_csv('info1_copy.csv')
读
info_csv1=pd.read_csv('filepython1.csv'),默认有标题
info_csv2=pd.read_csv('filepython2.csv',header=None),没有标题
info_csv3=pd.read_csv('filepython2.csv',names=['a','b','c','message']) 自定义标题
bigdata=pd.read_csv('bigdata.csv',header=None,chunksize=10)<br>print(bigdata.get_chunk(5)) 分块读<br>
bigdata2=pd.read_csv('bigdata.csv',header=None,iterator=True)<br>bigdata2.get_chunk(10) 分块读取,迭代显示