DataFrame的数据处理笔记

参考了好兄弟的blog

创建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分组

关于groupby可以去看这个大哥的blog
在这里插入图片描述

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问题

如下图
在这里插入图片描述

未完待续,这个文章会持续更新

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值