文章目录
创建DataFrame
先创建几个series
series1=pd.Series([11,22,33,44,55])
series2=pd.Series(['aa','bb','cc','dd','ee'])
方式一
df=pd.DataFrame({'col1':series1,'col2':series2})
col1 col2
0 11 aa
1 22 bb
2 33 cc
3 44 dd
4 55 ee
方式2
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
A B
0 1 2
1 3 4
DF的特性和简单函数使用
创建一个df
data=np.random.random(25).reshape(5,5)
df=pd.DataFrame(data,columns=list('ABCDE'),index=list('abcde'))
最基本的特性
df.shape
# 可以提取df的index,转化为各种东西,主要是转化为list
df.index.to_list()
# 可以提取df的columns,转化为各种东西,主要是转化为list
df.columns.to_list()
# 计算df中非NAN的数据个数
df.count()
Summary 一些统计学的函数
df.sum(axis=1)# 可以将计算df各列的sum,或者df各行的sum
df.cumsum(axis=1)# 累加函数,默认从上往下按行累加(这个可以用来计算月累积量什么的)
# 可以统计每行/每列的最值,返回的都是series
df.min(axis=1)
df.max(axis=0)
# 这个可以找到最值所在的index
df.idxmax(axis=1)
df.idxmin(axis=1)
df.mean(axis=1)# 找均值
df.median(axis=1)# 找中位数
DF的遍历
# 按行遍历
for ind,row in df.iterrows():
print(ind)
print(row['t1'])
# 按列遍历
for col_name,col in df.iteritems():
print(col_name)
print(col.values)# col为series
# 按元组的方式进行遍历
for row in df.itertuples():
print(tuple(row))
# series 的遍历
def func(x):
print(x)
tmp=df['t1']
tmp.apply(func)# 遍历方式1
for i in tmp:# 遍历方式2
print(i)
# tmp.apply(lambda x:x+1)
DF的修改
修改行,列名
df.columns=['test1','test2']# 修改df的列名
df.index=['a','b','c','d','e']# 修改df的行名(index)
df=df.rename(columns={'test1':'t1','test2':'t2'})# 也能这样改
DF添加行和列
添加行
# 1 loc
df.loc[5]=[np.nan,'ff']# df在index=5上添加一行
# 2 append
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df1.append(df2,ignore_index=True)# ignore_index可以重新排列index
# 3 使用append添加多行
df3=pd.DataFrame(columns=list('AB'))
for i in range(5):
df3=df3.append({'A':i,'B':i+1},ignore_index=True)# 小坑,需要重新赋值
# 4 高效方法添加遍历添加多行
pd.concat([pd.DataFrame([i],columns=['A']) for i in range(5)],ignore_index=True)
# concat函数将一个list[df1,df2,df3]组合成一个大df
output:
添加列
df = pd.DataFrame(columns=['name','number'], data=[['cat',3]])# 注意数据要是2维的
# 1 直接df['name']
df['leg']=df['number']*4# 添加一列,计算猫有几条腿
df['head']=1
# 2 采用insert的方法
'''
DataFrame.insert(loc, column, value, allow_duplicates=False)
'''
df.insert(1,'tail',1,allow_duplicates=False)
output:
DF的删除
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D3', 'D3']},)
df1.drop('A',axis=1)# 删除列
df1.drop(1,axis=0)# 删除行
# 根据list来删除
df1.drop(['A','C'],axis=1)
df1.drop([0,2],axis=0)
output:
DF的选择
loc和iloc
# df的选择
data=np.random.random(25).reshape(5,5)
df=pd.DataFrame(data,columns=list('ABCDE'),index=list('abcde'))
# 按标签选择
df.loc['a':'c',['A','B']]# 按标签选择多列数据,切片(提取一块)
df.loc['a','A']# 提取一个元素
# 按位置选择
df.iloc[3]# 选择一行
df.iloc[3:5,0:2]# 选择一块
df.iloc[[1,3],[2,4]]# list切片
df.iloc[1,1]# 提取值
DF的筛选
感觉df的筛选主要是筛选行,因为行是数据元素,
列为数据的特征,所以我们是根据特征是否满足条件来筛选元素的
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['123', 'B1', '123', 'B3'],
'C': ['7178', '2345', '1234', 'C3'],
'D': ['D0', 'D1', '1234', 'D3']},)
# 根据多个条件来进行筛选
df1[(df1['A'].notna())
&(df1['C'].str.contains('1'))
&(df1['B'].str.match(r"[0-9]+"))].reset_index(drop=True)
df1:
ouput:
# df的筛选
data=np.random.random(25).reshape(5,5)
df=pd.DataFrame(data,columns=list('ABCDE'),index=list('abcde'))
# 布尔索引
df[df.A>0.5]# 按条件筛选行
df[df>0.1]# 不满足的块置为Nan
df1=df.copy()
# 设置一个集合Q,提取df的一列W,可以提取W中属于Q的那些行
df1['F']=['one', 'one', 'two', 'three', 'four']
df1[df1['F'].isin(['two','one'])]
ouput:
df上使用groupby分组
df1 = pd.DataFrame({'姓名': ['小红', '大红', '小明', '大明', '小亮'],
'性别': ['女', '女', '男', '男','男'],
'班级': [1, 2, 1, 1,2],
'身高': [161, 161, 180, 180,170]},)
# 显示所有数据
df1.groupby('身高').apply(lambda x:x[:])
# 将数据的某一列转化为list
df1.groupby('身高')['班级'].apply(lambda x:x[:]).to_list()
# 得到分组后的组名
df1.groupby('身高')['班级'].apply(lambda x:x[:]).index.to_list()
# 不知道有什么用
# df1.groupby('班级')['身高'].transform('mean')
# df1.groupby('班级')['身高'].apply(lambda x:x[:])
# df1.groupby('性别')['身高'].describe().unstack()
# 多类分组
df1.groupby(['班级','性别']).describe()
df1.groupby(['班级','性别']).agg([np.sum,np.mean,np.std])#分组后多个运算
output:
DF上的一些函数使用
聚合和转换
apply函数
# apply函数
tmp=np.random.random(25).reshape(5,5)
df=pd.DataFrame(tmp,columns=list('ABCDE'))
# apply返回的对象可以是series对象或者dataFrame对象,这取决于所用的函数是什么
df.apply([max,min])# 默认对每一列使用
df[['A','B']].apply(np.mean)# 对特定的列使用函数
df.apply({'A':'mean','B':['max','min']})# 可以指定列来使用对应的函数组合
output:
agg函数
# 大致是与apply函数一致的
data=np.random.random(25).reshape(5,5)
df=pd.DataFrame(data,columns=list('ABCDE'),index=list('abcde'))
# 应用多个函数
df.agg(['max','min','mean','median'])
# 使用字典的话可以对特定列使用特定个函数
df.agg({'A':['mean','max'],'C':['min','max']})
transform函数
这个再说
DF上的排序和Rank
# df的排序和rank
data=np.random.random(25).reshape(5,5)
df=pd.DataFrame(data,columns=list('ABCDE'),index=list('adceb'))
# 按index排序
df.sort_index()
# 按某列排序,从小到大
df.sort_values(by='A')
# 给每个值赋上排名
df.rank()
其他
数据覆盖问题
# 数据覆盖问题
'''
由于dictionary定义在循环之外,每次给list赋值的都是同一块地址,
所以后面的数据会覆盖前面的数据,这可以从print出来的id看出来
'''
list1=[]
dictionary={"num":""}
for i in range(4):
dictionary["num"]=i
print(id(dictionary))
list1.append(dictionary)
print(list1)
output:
'''
2046826984696
2046826984696
2046826984696
2046826984696
[{'num': 3}, {'num': 3}, {'num': 3}, {'num': 3}]
'''
# 正确做法
list1=[]
for i in range(4):
dictionary={"num":""}
dictionary["num"]=i
print(id(dictionary))
list1.append(dictionary)
print(list1)
output:
'''
2046826685128
2046826876424
2046826685688
2046827112392
[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}]
'''
axis问题
如下图
未完待续,这个文章会持续更新