【Python进阶(八)】——数据框

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

   个人介绍: 研一|统计学|干货分享
         擅长Python、Matlab、R等主流编程软件
         累计十余项国家级比赛奖项,参与研究经费10w、40w级横向

【Python进阶(八)】——数据框,建议收藏!


该篇文章主要讲解了Python数据结构之DataFrame,针对DataFrame不同数据操作形式及基础统计方法进行实例演示。

1 数据框的创建方法

1.1 直接定义

  运行程序:

import numpy as np
import pandas as pd
df1=pd.DataFrame(np.arange(10).reshape(2,5))
df1

  运行结果:

1.2 导入定义

  运行程序:

import openpyxl 
import pandas as pd
df2=pd.read_excel('1副本1.xlsx')#读取数据
df2.shape#形状
df2=df2[["Time     t(s)","Q"]]#提取对应列
df2.head() #显示前5行

  运行结果:

(404, 1300)

2 查看行或列

  运行程序:

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"  ##执行多输出

df2.index#查看行名,即行的显式索引-用index属性

df2.index.size #行大小

df2.columns #显示列名
 
df2.columns.size#列大小

    
df2.shape#数据框形状

print("行数为:", df2.shape[0])
print("列数为:", df2.shape[1])

  运行结果:

RangeIndex(start=0, stop=404, step=1)
404
Index(['Time     t(s)', 'Q'], dtype='object')
2
(404, 2)
行数为: 404
列数为: 2

3 引用行或列

  运行程序:

df2["Time     t(s)"].head()#时间列前几行

df2.Q.head()  #Q列前几行

df2["Time     t(s)"][2]  #时间列第3个

df2.Q[2]#Q列第三个

df2["Time     t(s)"][[2,4]]#时间列第3个和第5个

df2.loc[1,"Time     t(s)"] #显式index,时间列第2个

df2.iloc[1,0] #第2行第1列,隐式index


df2[["Q","Time     t(s)"]].head()#Q和时间列前5行,显式访问非连续元素

  运行结果:

0    0.0
1    0.5
2    1.0
3    1.5
4    2.0
Name: Time     t(s), dtype: float64
0    2579.22
1    2583.97
2    2583.97
3    2588.75
4    2593.44
Name: Q, dtype: float64
1.0
2583.97
2    1.0
4    2.0
Name: Time     t(s), dtype: float64
0.5
0.5

4 index操作

  运行程序:

df2.index#索引状况

df2.columns#列名

df2["Q"].head()#Q列前几行

df2.reindex(index=["1","2","3"],columns=["1","2","3"])#更改显示index方法,调整index顺序
df2.head()#df2前几行
  
df2.reindex(index=[2,3,1], columns=["Q","Time     t(s)"])#更改显示index方法,调整index顺序

df3=df2.reindex(index=[2,3,1], columns=["diagnosis","id","area_mean","MyNewColumn"],fill_value=100)#修改index顺序后,新增列

df3    

  运行结果:

RangeIndex(start=0, stop=404, step=1)
Index(['Time     t(s)', 'Q'], dtype='object')
0    2579.22
1    2583.97
2    2583.97
3    2588.75
4    2593.44
Name: Q, dtype: float64

5 删除或过滤行/列

  运行程序:

import pandas as pd
df2 = pd.read_csv('bc_data.csv')#导入文件

df2=df2[["id","diagnosis","area_mean"]]#提取对应列
df2.head()#显示前几行

df2.drop([2]).head()#删除第三行

df2.head()#显示前几行

  运行结果:

  运行程序:

import pandas as pd
df2 = pd.read_csv('bc_data.csv')
df2=df2[["id","diagnosis","area_mean"]]
    
df2.drop([3,4], axis=0, inplace=True)#删除第4、5行,》drop不改变数据框本身
df2.head()

  运行结果:

  运行程序:

import pandas as pd
df2 = pd.read_csv('bc_data.csv')
df2=df2[["id","diagnosis","area_mean"]]
df2.drop(["id","diagnosis"], axis=1, inplace=True)#删除列   
    
df2.head()

  运行结果:

  运行程序:

import pandas as pd
df2 = pd.read_csv('bc_data.csv')
df2=df2[["id","diagnosis","area_mean"]]
df2.drop(["id","diagnosis"], axis=1, inplace=True)#删除列   
    
df2.head()

  运行结果:

  运行程序:

import pandas as pd
df2 =pd.read_csv('bc_data.csv')

df2=df2[["id","diagnosis","area_mean"]]
df2[df2.area_mean> 1000].head()#满足对应列值大于1000

  运行结果:

  运行程序:

df2[df2.area_mean> 1000][["id","diagnosis"]].head()#妈祖对应列大于1000且仅显示对应列

  运行结果:

6 算数运算

  运行程序:

df4=pd.DataFrame(np.arange(6).reshape(2,3))
df4#矩阵转成数据框

df5=pd.DataFrame(np.arange(10).reshape(2,5)) #矩阵转成数据框
df5

df4+df5#矩阵加法:先补齐显式index(新增索引对用值为NaN),得到相同结构后再进行计算

  运行结果:

  运行程序:

df6=df4.add(df5,fill_value=10)#默认填充的NAN改为固定值10
df6

s1=pd.Series(np.arange(3))#将数组改变为序列类型
s1


df6-s1#按行广播,先把行改为等长,行内不做循环补齐,只是一行一行计,不会跨行广播

df5=pd.DataFrame(np.arange(10).reshape(2,5))
df5
s1=pd.Series(np.arange(3))
df5-s1

  运行结果:

  运行程序:

df5=pd.DataFrame(np.arange(10).reshape(2,5))
s1=pd.Series(np.arange(3))
df5.sub(s1,axis=1)#逐行计算:df5-s1
    

    
df5=pd.DataFrame(np.arange(10).reshape(2,5))
s1=pd.Series(np.arange(3))
df5.sub(s1,axis=0)#逐列计算:df5-s1

df7=pd.DataFrame(np.arange(20).reshape(4,5))
df7

df7+2#所有数+2

print(df7)
print("df7.cumsum=",df7.cumsum()) #累计逐行求和

df7

df7.rolling(2).sum() #依次计算相邻两个元素之和,即本元素和上一个元素之和,默认按行

df7.rolling(2,axis=1).sum() #依次计算相邻两个元素之和,即本元素和上一个元素之和,按列

df7.cov()#协方差矩阵

df7.corr()#相关系数矩阵

import pandas as pd
df2 = pd.read_csv('bc_data.csv')
df2=df2[["id","diagnosis","area_mean"]][2:5]
df2.T#数据框的转置

  运行结果:

7 大小比较运算

  运行程序:

print(df6)

df6>5#判断元素是否大于5

print(s1)

df6>s1 #判断是否大于s1,按行

  运行结果:

8 统计信息

  运行程序:

import numpy as np
import pandas as pd

df2 = pd.read_csv('bc_data.csv')

df2=df2[["id","diagnosis","area_mean"]]

df2.describe()#描述性统计

dt = df2[df2.diagnosis=='M']#条件过滤,提取满足条件行
dt.head()

dt.tail()#显示最后几行


df2[["area_mean","id"]].head()#条件列前几行

  运行结果:

9 排序

  运行程序:

df2.head(8)

df2.sort_values(by="area_mean",axis=0,ascending=True).head()#行值排序

df2.sort_index(axis=1).head(3)#列值排序
    

df2.sort_index(axis=0,ascending=False).head(3)#index倒序
    

  运行结果:

10 导入/导出

  运行程序:

import os
print(os.getcwd())#查看当前目录

df2.head(3).to_csv("df2.csv")#保存为csv文件

import pandas as pd
df3 = pd.read_csv('df2.csv') #读取文件
df3

df3 = pd.read_csv('df2.csv')#读取文件
df3

df2.head(3).to_excel("df3.xls")#保存为excel文件
df3 = pd.read_excel("df3.xls")#读取excel文件
df3

  运行结果:

11 缺失数据处理

  运行程序:

df3.empty#判断一个数据框是否有空数据集

np.nan-np.nan +1#nan可以参加运算

np.nan-np.nan

None+1 #【提示】报错信息为TypeError: unsupported operand type(s) for +: 'NoneType' and 'int',原因分析:None不能参加算数运算。
        #None是Python基础语法中的特殊数据类型,不属于数值类型,不能参加算数运算

  运行结果:

False
nan
nan
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[28], line 7
      3 np.nan-np.nan +1#nan可以参加运算
      5 np.nan-np.nan
----> 7 None+1

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

  运行程序:

import pandas as pd
import numpy as np
A=pd.DataFrame(np.array([10,10,20,20]).reshape(2,2),columns=list("ab"),index=list("SW"))
A

list("ab")#列表

B=pd.DataFrame(np.array([1,1,1,2,2,2,3,3,3]).reshape(3,3), columns=list("abc"),index=list("SWT"))
B

C=A+B #先补列索引,并补NaN

C

  运行结果:

A.add(B,fill_value=0) #数据框相加,空值补齐NaN

A.add(B,fill_value=A.stack().mean()) #缺失值用均值补齐

A.mean()#按列计算均值

A.stack() #建立多级索引,计算一个数据框中所有index不同列均值

A.stack().mean()

C
C.isnull()#判断数据框每个元素为空值

C.notnull()#判断数据框每个元素不为空值

C.dropna(axis='index')#直接删除缺失值,axis='index':某行存在缺失值,直接删除改行

C.fillna(0)#用0填补空值

C.fillna(method="ffill")#向前填充

C.fillna(method="bfill",axis=1) #向后填充

12 分组统计

  运行程序:

import pandas as pd
df2 = pd.read_csv('bc_data.csv')


df2=df2[["id","diagnosis","area_mean"]]


df2.head()

    
df2.groupby("diagnosis")["area_mean"].mean()#按照diagnosis分组计算area_mean均值

    
df2.groupby("diagnosis")["area_mean"].aggregate(["mean","sum","max",np.median])#按照diagnosis分组计算area_mean均值、求和、最大值、中值

df2.groupby("diagnosis")["area_mean"].aggregate(["mean","sum"]).unstack()#将关系转化为二级索引


    
def myfunc(x):
   x["area_mean"]/=x["area_mean"].sum()
   return x

df2.groupby("diagnosis").apply(myfunc).head()#分组自定义函数计算

  运行结果:

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小墨&晓末

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值