Pandas中DataFrame类型数据的常用操作

鳄鱼君Ba

发表文章数:519

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Pandas中DataFrame类型数据的常用操作

创建一个随机的DataFrame数据,然后修改DataFrame数据中的某一列数据

data=DataFrame(data=np.random.randint(0,100,size=(5,4)),index=['a','b','c','d','e'],columns=['A','B','C','D'])
data['A']=0
print(data)

   A   B   C   D
————————————————
a  0  43  49  34
b  0  57  11  88
c  0  88  22  32
d  0  99  80  66
e  0  29  39  70

也可以这样修改:

data['A']=range(15,20)
print(data)

    A   B   C   D
——————————————————
a  15  89  66  57
b  16  96  46  50
c  17  75  55  11
d  18  16  52  85
e  19  20  34  19

传入Series类型修改DataFrame数据中某一列数据,需要指定Series类型的index行索引

series_data=pd.Series([1,2,3,4,5],index=['a','c','b','d','e'])
data['A']=series_data
print(data)

   A   B   C   D
————————————————
a  1  43  29  84
b  3  46  70  13
c  2  43   6  58
d  4  92  54  36
e  5  59  57  48

删除DataFrame数据中的某一列数据

del data['A'] # 删除A列数据
print(data)

    B   C   D
——————————————
a  15  87  70
b  55  32  22
c  30  46  26
d  46  18  54
e  28  97  73

删除某一行数据

data=data.drop('a') # 删除a行
print(data)

根据新的索引重新排列数据,不能超出原有的索引内容,如果新规定的行索引不存在,数据为NaN

data=data.reindex(['b','a','d','c','e'])
# 如果想要将缺失位置的NaN修改为0
# data=data.reindex(['b','a','d','c','f'],fill_value=0)
print(data)

    A   B   C   D
——————————————————
b  36  52  26  88
a  15  65  58  34
d   3  65  34   6
c  98  25  30  73
e  86  93  40  34

将缺失位置的NaN通过插值法计算并不上内。ffill:从前面数据计算差值;bfill:从后面数据计算差值。

data=DataFrame(data=np.random.randint(0,100,size=(5,4)),index=['a','b','c','d','e'],columns=['A','B','C','D'])
data=data.reindex(['b','a','d','c','f'],method='ffill')
print(data)

  A   B   C   D
————————————————
b  49  11  26  87
a   2  49  80  36
d  43  58  67  51
c  98  92  94  59
f  17  58  65   8

扔掉包含缺失的数据(NaN)的行或者扔掉全部都是缺失数据的行

print(data.dropna()) # 扔掉包含缺失的数据(NaN)的行

print(data.dropna(how='all')) # 扔掉全部都是缺失数据的行

填充所有缺失数据为一个值(0)

print(data.fillna(0))

按列填充确实数据为不同的值,这里假设有gender、student、score三列数据,如果gender缺失为M,student缺失未unknow,score缺失未60:

print(data.fillna(
    {'gender':'M','student':'unknow','score':60}
))

筛选数据,找出B列中大于等于20的数据

data=DataFrame(data=np.random.randint(0,100,size=(5,4)),index=['a','b','c','d','e'],columns=['A','B','C','D'])

print(data['B']>=20)

a    True
b    True
c    True
d    True
e    True
Name: B, dtype: bool

print(data[data['B']>=20])

    A   B   C   D
——————————————————
a   0  96  65  86
b  13  98   9  31
d  79  31  51  62

data[‘B’]>=20会得到一组布尔类型,data[data[‘B’]>=20]就相当于data[True]或者data[False],True和False就是通过data[‘B’]>=20来的。

列表中筛选数据,筛选name列数据在某个列表里面的元素,还是通过布尔值筛选

dic={
    'name':['鳄鱼君Ba','www.e1yu.com'],
    'salary':['1200','3333']
}
data=pd.DataFrame(data=dic,columns=['salary','name']) # 使用字典创建
select_list=['www.e1yu.com',20,30]
print(data[data['name'].isin(select_list)])

   salary          name
——————————————————————
1   3333  www.e1yu.com

利用groupby对数据进行分组机选sum,mean等

data=pd.DataFrame({
    'cate_id':['a','b','c','d','e'],
    'count':[10,20,30,40,50]
})
group_data=data.groupby('cate_id')
print(group_data) # <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000000006991C08>

print(group_data.sum())

         count
cate_id       
a           10
b           20
c           30
d           40
e           50

DataFrame数据排序

数据排序——按索引名称升序

data=pd.DataFrame({
    'cate_id':['a','b','c','d','e'],
    'count':[10,20,30,40,50]
})
print(data.sort_index())

  cate_id  count
0       a     10
1       b     20
2       c     30
3       d     40
4       e     50

数据排序——按索引名称降序

data=pd.DataFrame({
    'cate_id':['a','b','c','d','e'],
    'count':[10,20,30,40,50]
})
print(data.sort_index(ascending=False))

  cate_id  count
4       e     50
3       d     40
2       c     30
1       b     20
0       a     10

数据排序——按某一列的数据进行排序

data=DataFrame(data=np.random.randint(0,100,size=(5,4)),index=['a','b','c','d','e'],columns=['A','B','C','D'])
print(data.sort_values(by='B'))

    A   B   C   D
a  93  33  63   5
b  49  49  18  91
d  40  59  98  42
e  65  83  40  35
c  38  89  54  95

数据汇总

data=DataFrame(data=np.random.randint(0,100,size=(5,4)),index=['a','b','c','d','e'],columns=['A','B','C','D'])
print(data.sum())

A    321
B    278
C    192
D    233
dtype: int64

pandas统计方法

函数 说明
count 计算非NaN数据的数量
min、max 计算最小、最大值
argmin、argmax 计算最小、最大值的位置
sum 计算数值的和
mean 计算平均数
median 计算中位数
var 计算方差
std 计算标准差

pandas的层次化索引

同一个轴,可以用多种方式来索引。我们创建两个索引

data=pd.Series(
    np.random.randint(1,6,size=7),
    index=[
        ['b1','b2','b3','b4','b5','b6','b7'],
        [1,2,1,2,1,2,3]
    ]
)
print(data)

b1  1    4
b2  2    4
b3  1    3
b4  2    5
b5  1    2
b6  2    2
b7  3    4
dtype: int32

两个DataFrame进行合并,合并必须要有公有列

data1=pd.DataFrame({
      'key':['11','22','33','44'],
      'data1':['100','200','300','400']
})
data2=pd.DataFrame({
    'key':['11','22','33','44'],
    'data2':['500','600','700','800']
})
print(pd.merge(data1,data2))

  key data1 data2
0  11   100   500
1  22   200   600
2  33   300   700
3  44   400   800

两个DataFrame进行合并,指定连接方式

data1=pd.DataFrame({
      'key':['11','22','33','44','55'],
      'data1':['100','200','300','400','900']
})
data2=pd.DataFrame({
    'key':['11','22','33','44'],
    'data2':['500','600','700','800']
})
print(pd.merge(data1,data2)) # 默认连接方式,会删掉不是共同拥有的

  key data1 data2
0  11   100   500
1  22   200   600
2  33   300   700
3  44   400   800
print(pd.merge(data1,data2,how='outer)) # 不希望删掉不是共同拥有的
  key data1 data2
0  11   100   500
1  22   200   600
2  33   300   700
3  44   400   800
4  55   900   NaN
# how的参数还可以为left、right

两个DataFrame进行合并,分别指定连接的列名称

data1=pd.DataFrame({
      'lkey':['11','22','33','44','55'],
      'data1':['100','200','300','400','900']
})
data2=pd.DataFrame({
    'rkey':['11','22','33','44'],
    'data2':['500','600','700','800']
})
print(pd.merge(data1,data2,left_on='lkey',right_on='rkey'))

  lkey data1 rkey data2
0   11   100   11   500
1   22   200   22   600
2   33   300   33   700
3   44   400   44   800

练习:

1.假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末成绩的平均值。

2.假设张三期中考试数学被发现作弊,要记为0分,如何实现?

3.李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?

4.后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?

dic={
    '张三':[150,150,150,150],
    '李四':[0,0,0,0]
}
df=DataFrame(data=dic,index=['语文','数学','英语','理综']) 
ddd=df #期中考试
ddd2=df #期末考试
        张三   李四
———————————————————
语文	150	0
数学	150	0
英语	150	0
理综	150	0

求平局值,ddd+ddd2除2即可:

ddd+ddd2 / 2
        张三	李四
————————————————————
语文	225.0	0.0
数学	225.0	0.0
英语	225.0	0.0
理综	225.0	0.0

将张三的数学成绩改为0:

ddd.loc['数学','张三'] =0 # 行为数学,列为张三
	张三	李四
——————————————————
语文	150	0
数学	0	0
英语	150	0
理综	150	0

李四成绩都加100:

ddd['李四']+=100 # 取列
	张三	李四
————————————————————
语文	150	100
数学	0	100
英语	150	100
理综	150	100

全部加10:

ddd+=10
	张三	李四
————————————————————
语文	160	110
数学	10	110
英语	160	110
理综	160	110

未经允许不得转载:作者:鳄鱼君Ba, 转载或复制请以 超链接形式 并注明出处 鳄鱼君Ba
原文地址:《Pandas中DataFrame类型数据的常用操作》 发布于2020-05-24

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

8 + 3 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册