Python
2023-03-30 18:41:54 0 举报
AI智能生成
python,大数据学习笔记
作者其他创作
大纲/内容
pandas
数据清洗和整理
缺失值
#找缺失值 isnull(),notnull()
data1.isnull()
data1.isnull()
#滤除缺失数据(法一和法二等价)
data1.dropna()
data1[data1.notnull()]
data2.dropna(axis=1,how='all')-滤去整行/列
data1.dropna()
data1[data1.notnull()]
data2.dropna(axis=1,how='all')-滤去整行/列
df.dropna(thresh=2)#丢弃含有两个Nan的行
#填充:df.fillna(0)/df.fillna({1:0.9,2:0},inplace=True)
df2.fillna(method='ffill')填充和上行相同的
df2.fillna(method='ffill',limit=2)#指定行数进行填充
df2.fillna(method='ffill')填充和上行相同的
df2.fillna(method='ffill',limit=2)#指定行数进行填充
重复数据
data2.duplicated()
data2.drop_duplicates()
data2.drop_duplicates([0],keep='last')
data2.drop_duplicates([0],keep='last')
数据转换
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()
data.index.map(tran)
data.index.map(tran)
面元划分
cats=pd.cut(ages,bin)cats2=pd.cut(ages,bin,right=False)
cats.categories 标签
pd.value_counts(cats) 划分并且统计数量
names=['青年','年轻人','中年','老年']
cats3=pd.cut(ages,bin,labels=names) 自定义区间划分呢
cats3=pd.cut(ages,bin,labels=names) 自定义区间划分呢
pd.cut(data,4,precision=2)#指定面元数
cat=pd.qcut(ages,4)
pd.value_counts(cat)cut划分是各区间数量不同,而qcut则根据区间长度将数量成比例划分
pd.value_counts(cat)cut划分是各区间数量不同,而qcut则根据区间长度将数量成比例划分
异常值过滤
假设把绝对值为3以上的数视为异常值
df1[(np.abs(df1)>3).any(1)]
排列与随机采样
sam=np.random.permutation(2)
df.take(sam)
df.take(sam)
df.sample(3)
df1.sample(10,replace=True)-replace允许重复抽样
df1.sample(10,replace=True)-replace允许重复抽样
字符串操作
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+')编译
res.split(text)
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')
重塑层次化索引
列索引转换为行索引,(DataFrame->Series)
r=data.stack() 默认过滤缺失值
r=data.stack() 默认过滤缺失值
unstack() 默认转换的层级为level=1,可指定层级
r.unstack()
r.unstack()
轴向旋转
df3.pivot('date','class','values')
分组与聚合
分组r=df1.groupby(by='fruit')
for i in r:
print(i)
for name,group in r:
print(name)#输出组名
print(group)#输出数据块(数据块是dataframe类型)
dict(list(df1.groupby(by='fruit')))['apple']选择任一数据快
for i in r:
print(i)
for name,group in r:
print(name)#输出组名
print(group)#输出数据块(数据块是dataframe类型)
dict(list(df1.groupby(by='fruit')))['apple']选择任一数据快
多条件分组df1.groupby(by=['fruit','color'])['price'].mean()
#备:如果要把type变为DataFrame,则在['price']增加一个中括号
df1.groupby(by=['fruit','color'])[['price']].mean()
#备:如果要把type变为DataFrame,则在['price']增加一个中括号
df1.groupby(by=['fruit','color'])[['price']].mean()
聚合df1.groupby(by='fruit')['price'].mean()
#count,sum,mean,median,std,var,min,max,prod,first,last(非NAN值的第一个和最后一个)
#以上函数都表示非NAN值的部分
#count,sum,mean,median,std,var,min,max,prod,first,last(非NAN值的第一个和最后一个)
#以上函数都表示非NAN值的部分
自定义聚合函数
def diff(arr):
return arr.max()-arr.min()
df1.groupby('fruit')['price'].agg(diff)
def diff(arr):
return arr.max()-arr.min()
df1.groupby('fruit')['price'].agg(diff)
计算
NAN视为0,如果不忽略NAN,那么指定skipna为False
print(df.sum(axis=1,skipna=False))
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)-值排序
data2.sort_values(by='a',axis=1,ascending=False)-根据指定列排序
data2.sort_values(by='a',axis=1,ascending=False)-根据指定列排序
uni1=data3.unique()-唯一值
data3.value_counts()#统计重复出现的次数
data4.index.is_unique-判断索引是否唯一
data3.isin([5])-判断成员是否存在
缺失值
判断:isnull();丢弃:dropna();填充:fillna()
索引操作
重新索引
#行重新索引
d2=d1.reindex([0,1,2,3])
print(d2)
#列重新索引
d3=d1.reindex(columns=[0,1,2,3,4])
d2=d1.reindex([0,1,2,3])
print(d2)
#列重新索引
d3=d1.reindex(columns=[0,1,2,3,4])
增删
增
下标增加: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}
e2=e1.append(row,ignore_index=True)
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()
#选取
#外层选取
s1['b']
#内层-选取内层索引为2的
s1[:,2]
#选取具体的
s1['a',0]
#外层选取
s1['b']
#内层-选取内层索引为2的
s1[:,2]
#选取具体的
s1['a',0]
交换并排序:s1.swaplevel().sortlevel()
Series创建
列表:s1=pd.Series([1,2,3])
数组:s2=pd.Series(arr1)
字典:s3=pd.Series(dict)
若指定索引/顺序,那么增加参数index=[]
DataFrame创建
字典类
#列表,元祖或数组组成字典构建DataFrame
a={'a':[1,2,3],
'b':[4,5,6],
'c':[9,4,3]}
b=pd.DataFrame(a)
a={'a':[1,2,3],
'b':[4,5,6],
'c':[9,4,3]}
b=pd.DataFrame(a)
#根据Series创建DataFrame
pd1=pd.DataFrame({'a':pd.Series(np.arange(10)),
'b':pd.Series(np.arange(1,6))})
pd1=pd.DataFrame({'a':pd.Series(np.arange(10)),
'b':pd.Series(np.arange(1,6))})
#根据字典创建DataFrame
data2={'a':{'apple':3.6,'banana':5.6},
'b':{'apple2':2.3,'banana2':6.5}}
pd2=pd.DataFrame(data2)
data2={'a':{'apple':3.6,'banana':5.6},
'b':{'apple2':2.3,'banana2':6.5}}
pd2=pd.DataFrame(data2)
列表类
#2D ndarray构造列表
arr1=np.arange(24).reshape(4,6)
list1=pd.DataFrame(arr1)
##字典构成的列表构造
list2=[{'apple':2.3,'banana':4.4},
{'apple':1.2,'banana':4.1},
{'apple':5.3,'banana':2.4}]
pd2=pd.DataFrame(list2)
pd2#注意与以列表构成的字典相互区分。一个KEY是作为行索引,一个作为列索引
list2=[{'apple':2.3,'banana':4.4},
{'apple':1.2,'banana':4.1},
{'apple':5.3,'banana':2.4}]
pd2=pd.DataFrame(list2)
pd2#注意与以列表构成的字典相互区分。一个KEY是作为行索引,一个作为列索引
#Series构成的列表构造
list3=[pd.Series(np.random.rand(3)),
pd.Series(np.random.rand(2))]
pd3=pd.DataFrame(list3)
list3=[pd.Series(np.random.rand(3)),
pd.Series(np.random.rand(2))]
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)
print(bigdata.get_chunk(5)) 分块读
print(bigdata.get_chunk(5)) 分块读
bigdata2=pd.read_csv('bigdata.csv',header=None,iterator=True)
bigdata2.get_chunk(10) 分块读取,迭代显示
bigdata2.get_chunk(10) 分块读取,迭代显示
numpy
读写操作文件
read_csv(r'路径)
read.head()默认前五行
read.tail()默认后五行
数组的创建
arr=np.array([1,2,'te','4'])
arr=np.arange(0,10,2)/arr=np.arange(10)/arr=np.arange(24).reshape(4,6)
arr=np.random.random(行数,列数):随机产生0-1之间的数
arr=np.random.randint(0,9,size=(4,4))
arr=np.random.randn()生成均值为0,标准差为1的标准正态分布
np.random.choice(10,4)从某范围中随机选取
np.random.shuffle(b)打乱顺序
a=np.random.uniform(-10,10,size=(4,5)) uniform 平均分布
数组维度
arr=arr.reshape(3,4):不影响原数组
arr=arr.resize(3,4):影响原数组
arr=arr.flatten():转成一维数组,不影响原数组
arr=arr.ravel():转成一维数组,影响原数组
数组索引和切片
索引
print(arr[1])
布尔索引
c1[(c1<2)|(c1>10)]
切片
print(arr[4:6:2])
数组查询
查询2-3行
a2[1:3]#2-3行
间隔获取行数 0,2,3行
a2[[0,2,3]]
第2行,第2列
a2[1,1]
第一行第二列和第二行第五列,不连续
a2[[1,2],[2,5]]
基于两行的基础上,连续导出两列
a2[1:3,4:5]
获取某一列
a2[:,[1,2]]
数组值的替换
np.where(满足的条件a,满足条件时候的代替m,不满足条件时候的代替n)
c2[c2<4]=1
数组的叠加
vstack3=np.vstack([vstack1,vstack2])
hstack3=np.hstack([hstack1,hstack2])
concate3=np.concatenate([concate1,concate2],axis=None):axis=0,根据行叠加,axis=1,根据列叠加,axid=None,拼接成一维数组
数组的切割
np.hsplit(hs1,2)
np.vsplit(hs1,2)
np.hsplit(hs1,(1,2)):不平均切割
np.split(split1,5,axis=1):指定轴切割
函数
一元函数
二元函数
聚合函数
布尔判断函数
排序函数
其他
0 条评论
下一页