设置中文 sep=’\t’
csv文件默认的是以逗号为分隔符,但是中文中逗号的使用率很高,爬取中文数据时就容易造成混淆,所以使用pandas写入csv时可以设置参数 sep=’\t’ ,即以tab为分隔符写入。
一、读取和写入 1、可读文件
filepath_or_buffer #需要读取的文件及路径
sep / delimiter 列分隔符,普通文本文件,应该都是使用结构化的方式来组织,才能使用dataframe
header 文件中是否需要读取列名的一行,header=None(使用names自定义列名,否则默认0,1,2,…),header=0(将首行设为列名)
names 如果header=None,那么names必须制定!否则就没有列的定义了。
shkiprows= 10 # 跳过前十行
nrows = 10 # 只去前10行
usecols=[0,1,2,…] #需要读取的列,可以是列的位置编号,也可以是列的名称
parse_dates = [‘col_name’] # 指定某行读取为日期格式
index_col = None /False /0,重新生成一列成为index值,0表示第一列,用作行索引的列编号或列名。可以是单个名称/数字或由多个名称/数字组成的列表(层次化索引)
error_bad_lines = False # 当某行数据有问题时,不报错,直接跳过,处理脏数据时使用
na_values = ‘NULL’ # 将NULL识别为空值
encoding=’utf-8’ #指明读取文件的编码,默认utf-8
读取
1 2 3 4 import pandas as pd for inputfile in os.listdir(inputfile_dir): pd.read_csv(inputfile, header=None) #header=None表示原始文件数据没有列索引,这样的话read_csv会自动加上列索引 pd.to_csv(outputfile, mode='a', index=False, header=False) #header=0表示不保留列名,index=False表示不保留行索引,mode='a'表示附加方式写入,文件原有内容不会被清除
(1)不指定sheet参数,默认读取第一个sheet,
1 df=pd.read_excel("data_test.xlsx")
(2)指定sheet名称读取,
1 df=pd.read_excel("data_test.xlsx",sheet_name="test1")
(3)指定sheet索引号读取,
1 2 df=pd.read_excel("data_test.xlsx",sheet_name=0)#sheet索引号从0开始 pandas.read_csv(filepath_or_buffer, sep=’\t’, header=’infer’, names=None,index_col=None, dtype=None, engine=None, nrows=None)
读取全部文件并转成list
1 2 3 4 5 6 7 8 9 import pandas as pd import numpy as np import itertools # 分块处理大文件 df = pd.read_csv('1.csv',sep=",",encoding='utf-8') print(df) train_data = np.array(df) train_x_list=train_data.tolist()
写入
1 DataFrame.to_csv(path_or_buf=None, sep=’,’, na_rep=”, columns=None,header=True,index=True,index_label=None,mode=’w’,encoding=None)
使用to_csv函数实现以csv格式存储 使用read_csv函数来读取csv文件
1 2 3 4 5 import pandas as pd a=[{'_id': 1, 'name': '张三', 'Chinese': 67, 'Math': 89, 'English': 97},{'_id': 2, 'name': '李四', 'Chinese': 65, 'Math': 49, 'English': 78}] df=pd.DataFrame(list(a)) df.to_csv("ddd.csv", index=False, sep=',',encoding='gb2312') print(df)
1.1、head 1 2 3 pd.read_csv(data, header=0) # 第一行 pd.read_csv(data, header=None) # 没有表头 pd.read_csv(data, header=[0,1,3]) # 多层索引MultiIndex
1.2、数据类型 1 2 3 4 5 dtype可以指定各数据列的数据类型 # 传入类型名称,或者以列名为键、以指定类型为值的字典 pd.read_csv(data, dtype=np.float64) # 所有数据均为此数据类型 pd.read_csv(data, dtype={'c1':np.float64, 'c2': str}) # 指定字段的类型 pd.read_csv(data, dtype=[datetime, datetime, str, float]) # 依次指定
1.3、引擎 1 2 3 4 #使用的分析引擎可以选择C或Python。C语言的速度最快,Python语言的功能最为完善,一般情况下,不需要另行指定。 # 格式为engine=None,其中可选值有{'c', 'python'} pd.read_csv(data, engine='c')
1.4、时间处理 parse_dates参数用于对时间日期进行解析
1 2 3 4 5 6 7 8 9 10 # 布尔型、整型组成的列表、列表组成的列表或者字典,默认为False pd.read_csv(data, parse_dates=True) # 自动解析日期时间格式 pd.read_csv(data, parse_dates=['年份']) # 指定日期时间字段进行解析 # 将第1、4列合并解析成名为“时间”的时间类型列 pd.read_csv(data, parse_dates={'时间':[1,4]}) #to_datetime将字符串转成时间格式 ,可以指定列 df["日志接收时间"] = pd.to_datetime(df["日志接收时间"])
infer_datetime_format被设定为True并且parse_dates可用,那么Pandas将尝试转换为日期类型。
1 2 # 布尔型,默认为False pd.read_csv(data, parse_dates=True, infer_datetime_format=True)
对于DD/MM格式的日期类型,如日期2020-01-06,如果dayfirst=True,则会转换成2020-06-01。
1 2 # 布尔型,默认为False pd.read_csv(data, dayfirst=True, parse_dates=[0])
cache_dates如果为True,则使用唯一的转换日期缓存来应用datetime转换。解析重复的日期字符串,尤其是带有时区偏移的日期字符串时,可能会大大提高速度。
1 2 3 # 布尔型,默认为True pd.read_csv(data, cache_dates=False)
1.5、分块处理 1 2 3 4 5 6 7 8 9 10 11 12 # 分块处理大文件 df_iterator = pd.read_csv('cve.csv', chunksize=200,sep=",",encoding='gbk') for index,df_tmp in enumerate(df_iterator): for i in range(len(df_tmp)): print(df_tmp.iloc[i]) enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 >>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] >>> list(enumerate(seasons)) >>> [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
1.6、跳过指定行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 类似列表的序列或者可调用对象 # 跳过前三行 pd.read_csv(data, skiprows=2) # 跳过前三行 pd.read_csv(data, skiprows=range(2)) # 跳过指定行 pd.read_csv(data, skiprows=[24,234,141]) # 跳过指定行 pd.read_csv(data, skiprows=np.array([2, 6, 11])) # 隔行跳过 pd.read_csv(data, skiprows=lambda x: x % 2 != 0)
跳过空行
1 2 3 4 5 6 7 8 skip_blank_lines指定是否跳过空行,如果为True,则跳过空行,否则数据记为NaN。 # 布尔型,默认为True # 不跳过空行 pd.read_csv(data, skip_blank_lines=False) # 删除空数据所在的行 df.dropna(axis=0)
1.7、空值处理,跳过**[感觉这个适合使用】 1 2 3 4 5 na_filter是否检查丢失值(空字符串或空值)。设定na_filter=False可以提升读取速度。 # 布尔型,默认为True pd.read_csv(data, na_filter=False) # 不检查 [1,3,4,'','','']
1.8、过滤字符串 1 2 3 4 5 6 7 8 escapechar,用于过滤数据中的该转入符 # 长度为1的转义字符串,默认为None data = 'a,b,c~1,2,3~4,5,6dd\nd' df=pd.read_csv(StringIO(data), lineterminator='~',quotechar='"',escapechar='\n') for i in range(len(df)): print(list(df.iloc[i]))
1 2 3 4 如果在一行的开头找到该标识,则将完全忽略该行。此参数必须是单个字符。像空行一样 s = '# notes\na,b,c\n# more notes\n1,2,3' df=pd.read_csv(StringIO(s), sep=',', comment='#', skiprows=1) print(df)
1.10、drop 删除数据 drop 中 axis=0 表示行,axis=1 表示列
1 2 3 4 5 删除无用的列,列索引:'name','name1';inplace参数指是否替代原来的df data.drop(labels=['name','name1'],axis = 1,inplace=True) 删除无用的行,行索引:'涨跌' df.drop(['涨跌'], axis=0, inplace=True
2、逐行读取【多行读取】 iloc和loc loc按照标签取列,iloc按照位置取列
1 2 3 4 5 6 7 8 9 10 # 第1行 print(df.iloc[0]) # 前3行 print(df.iloc[:3]) # 第1列 print(df.iloc[:, 0]) # 前2列 print(df.iloc[:, :2]) exam_Y=examDf.loc[:,'学习时间']
3、获取其他信息 1 2 3 4 5 6 7 8 #获取文件头 df.head() #获取后五行 df.tail() #查看维度信息 df.shape #查看数据表基本信息(维度、列名称、数据格式、所占空间等) data.info()
4、用pandas读取非文件类型 4.1、pandas读取字符串 1 2 3 4 5 from io import StringIO data = 'a,b,c~1,2,3~4,5,6' df=pd.read_csv(StringIO(data), lineterminator='~') for i in range(len(df)): print(list(df.iloc[i]))
4.2、读取字节数据 1 2 3 4 5 6 from io import BytesIO data = (b'word,length\n' b'Tr\xc3\xa4umen,7\n' b'Gr\xc3\xbc\xc3\x9fe,5') pd.read_csv(BytesIO(data))
二、数据处理基础 1、字符串处理 1.1、cat函数用于字符串的拼接 1 2 3 4 df = pd.read_csv('cve.csv',sep=",",encoding='gbk') print(list(df.head())) z=df["0"].str.cat(df["poc"],sep='-'*3) print(list(z))
1.2、contains:判断某个字符串是否包含给定字符 1 2 3 4 df = pd.read_csv('cve.csv',sep=",",encoding='gbk') print(list(df.head())) z=df["0"].str.contains("2021") print(list(z))
1.3、startswith/endswith:判断某个字符串是否以…开头/结尾 1 2 3 4 5 6 df= pd.read_csv('cve.csv',sep=",",encoding='gbk') print(list(df.head())) z=df["0"].str.startswith("cve") H=df["0"].str.endswith("2021") print(list(z)) print(list(H))
1.4、count:计算给定字符在字符串中出现的次数 1 2 3 4 df = pd.read_csv('ip.csv',sep=",",encoding='utf-8') print(list(df.head())) z=df["city"].str.count("3") print(list(z))
1.5、get:获取指定位置的字符串 1 2 3 4 5 6 7 8 df = pd.read_csv('ip.csv',sep=",",encoding='utf-8') print(list(df.head())) z=df["ip"].str.get(-1) #转成字符串最后一个 z1=df["ip"].str.split(".") #以'.'分割 z2=df["ip"].str.split(".").str.get(0) print(list(z)) print(list(z1)) print(list(z2))
1.6、len:计算字符串长度 1 2 3 4 df = pd.read_csv('ip.csv',sep=",",encoding='utf-8') print(list(df.head())) z=df["ip"].str.len() print(list(z))
1.7、upper/lower:英文大小写转换 1 2 3 4 5 6 df = pd.read_csv('cve.csv',sep=",",encoding='gbk') print(list(df.head())) z1=df["name"].str.upper() #转成大写 z2=df["name"].str.lower() #转成小写 print(list(z1)) print(list(z2))
1.8、pad+side参数/center:在字符串的左边、右边或左右两边添加给定字符 1.9、 slice_replace:使用给定的字符串,替换指定的位置的字符 1 2 df = pd.read_csv('cve.csv',sep=",",encoding='gbk') z=df["name"].str.slice_replace(4,8,"*"*4)
1.10、replace:将指定位置的字符,替换为给定的字符串[可以使用正则替换 1 2 3 df = pd.read_csv('cve.csv',sep=",",encoding='gbk') z=df["name"].str.replace("-","_") z1=df["name"].str.replace("-\d{4}-","-xxxx-")
1.11、strip/rstrip/lstrip:去除空白符、换行符 1 2 df = pd.read_csv('cve.csv',sep=",",encoding='gbk') z=df["name"].str.str.strip()
1.12、findall:利用正则表达式,去字符串中匹配,返回查找结果的列表 1 2 df = pd.read_csv('cve.csv',sep=",",encoding='gbk') z1=df["name"].str.findall("cve.\d+")
2、判断重复值-duplicated() 1 df2.duplicated(subset=["col3","col4"])
3、groupby分组 3.1、count 过滤csv重复行 根据ip、city进行分组,并根据每组的isp计数
1 t=df.groupby(["ip","city"])["isp"].count()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import pandas as pd import numpy as np import itertools # 分块处理大文件 df = pd.read_csv('1.csv',sep=",",encoding='utf-8') #根据 t=df.groupby(["ip","city"]).count() temp=np.array(t).tolist() z=list(t.index) info=list() for i in range(len(z)): info.append([z[i],temp[i][0]]) print(info) 结果:[[('111.192.103.3', '东城区'), 3], [('111.192.98.74', '东城区'), 3], [('122.115.227.215', '北京市'), 2]]
3.2、sum
1 t=df.groupby(["ip"])["size"].sum()
仅按city 为东城区,对ip 和city进行分组,并对每组的isp进行计数
1 t=df[df["city"]=="东城区"].groupby(["ip","city"])["isp"].count()
过滤字段 清洗
1 z=df[(df["源境内外"]=="境外")&(df["目的境内外"]=="境内")].groupby(t)["目的IP地址"].count()
3.3、agg 1.将单个函数应用于组中的列
2.将多个函数应用于组中的列
4、排序 4.1、sort_values() 1 t=df.sort_values("日志接收时间")
4.2、sort_index() 1 info1=info.sort_index() info1=info.sort_index(axis="columns")
5、排名 rank方法。
6、合并拼接
merge方法主要基于两个dataframe的共同列进行合并,
join方法主要基于两个dataframe的索引进行合并,
concat方法是对series或dataframe进行行拼接或列拼接。
6.1、concat() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 info = pd.concat([info,df],axis=0,ignore_index=True) DEMO: judge=0 for i in os.listdir("file"): df=pd.read_csv("file/"+i,index_col=None, header=0).copy() if judge==0: info=df else: info = pd.concat([info,df],axis=0,ignore_index=True) judge+=1 info = info.sort_values("日志接收时间") print(info)
6.2、Merge方法 pandas的merge方法是基于共同列,将两个dataframe连接起来。merge方法的主要参数:
left/right:左/右位置的dataframe。
how:数据合并的方式。left:基于左dataframe列的数据合并;right:基于右dataframe列的数据合并;outer:基于列的数据外合并(取并集);inner:基于列的数据内合并(取交集);默认为’inner’。
on:用来合并的列名,这个参数需要保证两个dataframe有相同的列名。
left_on/right_on:左/右dataframe合并的列名,也可为索引,数组和列表。
left_index/right_index:是否以index作为数据合并的列名,True表示是。
sort:根据dataframe合并的keys排序,默认是。
suffixes:若有相同列且该列没有作为合并的列,可通过suffixes设置该列的后缀名,一般为元组和列表类型。
merges通过设置how参数选择两个dataframe的连接方式,有内连接,外连接,左连接,右连接,下面通过例子介绍连接的含义。
6.2.1 内连接[相同的列的交集】 how=’inner’,dataframe的链接方式为内连接,我们可以理解基于共同列的交集进行连接,参数on设置连接的共有列名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 单列的内连接 # 定义df1 取共同列alpha值的交集进行连接。 import pandas as pd import numpy as np df1 = pd.DataFrame({'alpha':['A','B','B','C','D','E'],'feature1':[1,1,2,3,3,1], 'feature2':['low','medium','medium','high','low','high']}) # 定义df2 df2 = pd.DataFrame({'alpha':['A','A','B','F'],'pazham':['apple','orange','pine','pear'], 'kilo':['high','low','high','medium'],'price':np.array([5,6,5,7])}) # print(df1) # print(df2) # 基于共同列alpha的内连接 df3 = pd.merge(df1,df2,how='inner',on='alpha') print(df3)
6.2.2 外连接[相同的列的并集】 how=’outer’,dataframe的链接方式为外连接,我们可以理解基于共同列的并集进行连接,参数on设置连接的共有列名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 单列的外连接 若两个dataframe间除了on设置的连接列外并无相同列,则该列的值置为NaN # 定义df1 df1 = pd.DataFrame({'alpha':['A','B','B','C','D','E'],'feature1':[1,1,2,3,3,1], 'feature2':['low','medium','medium','high','low','high']}) # 定义df2 df2 = pd.DataFrame({'alpha':['A','A','B','F'],'pazham':['apple','orange','pine','pear'], 'kilo':['high','low','high','medium'],'price':np.array([5,6,5,7])}) # 基于共同列alpha的内连接 df4 = pd.merge(df1,df2,how='outer',on='alpha') print(df4)
6.2.3 左连接[左表加相同的列的交集】 how=’left’,dataframe的链接方式为左连接,我们可以理解基于左边位置dataframe的列进行连接,参数on设置连接的共有列名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 单列的左连接 # 定义df1 df1 = pd.DataFrame({'alpha':['A','B','B','C','D','E'],'feature1':[1,1,2,3,3,1], 'feature2':['low','medium','medium','high','low','high']}) # 定义df2 df2 = pd.DataFrame({'alpha':['A','A','B','F'],'pazham':['apple','orange','pine','pear'], 'kilo':['high','low','high','medium'],'price':np.array([5,6,5,7])}) # 基于共同列alpha的左连接 df5 = pd.merge(df1,df2,how='left',on='alpha') print(df5)
因为df2的连接列alpha有两个’A’值,所以左连接的df5有两个’A’值,若两个dataframe间除了on设置的连接列外并无相同列,则该列的值置为NaN。
6.2.4 右连接[右表加相同的列的交集,数据以右表为基准】
how=’right’,dataframe的链接方式为左连接,我们可以理解基于右边位置dataframe的列进行连接,参数on设置连接的共有列名。
1 2 3 4 5 6 7 8 9 10 11 12 13 # 单列的右连接 # 定义df1 df1 = pd.DataFrame({'alpha':['A','B','B','C','D','E'],'feature1':[1,1,2,3,3,1], 'feature2':['low','medium','medium','high','low','high']}) # 定义df2 df2 = pd.DataFrame({'alpha':['A','A','B','F'],'pazham':['apple','orange','pine','pear'], 'kilo':['high','low','high','medium'],'price':np.array([5,6,5,7])}) # 基于共同列alpha的右连接 df6 = pd.merge(df1,df2,how='right',on='alpha') print(df6)
因为df1的连接列alpha有两个’B’值,所以右连接的df6有两个’B’值。若两个dataframe间除了on设置的连接列外并无相同列,则该列的值置为NaN。
6.2.5 基于多列的连接算法 多列连接的算法与单列连接一致,本节只介绍基于多列的内连接和右连接,读者可自己编码并按照本文给出的图解方式去理解外连接和左连接。 多列的内连接:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 多列的内连接 # 定义df1 df1 = pd.DataFrame({'alpha':['A','B','B','C','D','E'],'beta':['a','a','b','c','c','e'], 'feature1':[1,1,2,3,3,1],'feature2':['low','medium','medium','high','low','high']}) # 定义df2 df2 = pd.DataFrame({'alpha':['A','A','B','F'],'beta':['d','d','b','f'],'pazham':['apple','orange','pine','pear'], 'kilo':['high','low','high','medium'],'price':np.array([5,6,5,7])}) # 基于共同列alpha和beta的内连接 df7 = pd.merge(df1,df2,on=['alpha','beta'],how='inner') print(df7)
多列的右连接:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 多列的右连接 # 定义df1 df1 = pd.DataFrame({'alpha':['A','B','B','C','D','E'],'beta':['a','a','b','c','c','e'], 'feature1':[1,1,2,3,3,1],'feature2':['low','medium','medium','high','low','high']}) # 定义df2 df2 = pd.DataFrame({'alpha':['A','A','B','F'],'beta':['d','d','b','f'],'pazham':['apple','orange','pine','pear'], 'kilo':['high','low','high','medium'],'price':np.array([5,6,5,7])}) print(df1) print(df2) # 基于共同列alpha和beta的右连接 df8 = pd.merge(df1,df2,on=['alpha','beta'],how='right') print(df8)
6.2.6 基于index的连接方法 前面介绍了基于column的连接方法,merge方法亦可基于index连接dataframe
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 基于column和index的右连接 # 定义df1 df1 = pd.DataFrame({'alpha':['A','B','B','C','D','E'],'beta':['a','a','b','c','c','e'], 'feature1':[1,1,2,3,3,1],'feature2':['low','medium','medium','high','low','high']}) # 定义df2 df2 = pd.DataFrame({'alpha':['A','A','B','F'],'pazham':['apple','orange','pine','pear'], 'kilo':['high','low','high','medium'],'price':np.array([5,6,5,7])},index=['d','d','b','f']) print(df1) print(df2) # 基于df1的beta列和df2的index连接,left_on='beta' 表示左边这一列作为右边的索引 df9 = pd.merge(df1,df2,how='inner',left_on='beta',right_index=True) df9
设置参数suffixes以修改除连接列外相同列的后缀名。
1 2 3 4 # 基于df1的alpha列和df2的index内连接 df9 = pd.merge(df1,df2,how='inner',left_on='beta',right_index=True,suffixes=('_df1','_df2')) df9
7、时间序列,重采样 7.1、pd.date_range 如按月区间生成序列 1 date_range(start=None, end=None, periods=None, freq=None, tz=None,normalize=False, name=None, closed=None, **kwargs)
1 2 3 pd.date_range('20200801','20200810') pd.date_range(start='20200801',periods=10) pd.date_range(end='20200810',periods=10)
别名
偏移量类型
说明
D
Day
每日历日
B
BusinessDay
每工作日
H
Hour
每小时
T/min
Minute
每分
S
Second
每秒
L/ms
Million
每毫秒
U
Micro
每微妙
M
MonthEnd
每月最后一个日历日
BM
BusinessMonthEnd
每月最后一个工作日
MS
MonthBegin
每月第一个日历日
BMS
BusinessMonthBegin
每月第一个工作日
W-MON、W-TUE…
Week
从指定的星期几开始算起,每周
WOM-1MON、WOM-2MON…
WeekOfMonth
产生每月第一、二、三、四周的星期几,例如WOM-1MON表示每月的第一个星期一
Q-JAN、Q-FEB…
QuarterEnd
对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个日历日
BQ-JAN、BQ-FEB…
BusinessQuarterEnd
对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个工作日
QS-JAN、QS-FEB…
QuarterBegin
对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个日历日
BQS-JAN、BQS-FEB…
BusinessQuarterBegin
对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个工作日
A-JAN、A-FEB…
YearEnd
每年指定月份最后一个日历日
BA-JAN、BA-FEB…
BusinessYearEnd
每年指定月份最后一个工作日
AS-JAN、AS-FEB…
YearBegin
每月指定月份第一个日历日
BAS-JAN、BAS-FEB…
BusinessYearBegin
每月指定月份第一个工作日
7.2、resample 按时间聚合 1 2 3 4 5 import pandas as pd index = pd.date_range('1/1/2000', periods=9, freq='T') series = pd.Series(range(9), index=index) z=series.resample('3T').sum() print(z)
7.3、Timedelta 对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+和-运算符,需要导入timedelta这个类
1 2 3 4 #计算当前时间往后100天的日期 dt=now+pd.Timedelta(days=100) #只显示年月日 dt.strftime('%Y-%m-%d')
8、离散处理 1、diff函数 第一个离散的元素差异
1 DataFrame.diff(self, periods=1, axis=0)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 df = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6], ... 'b': [1, 1, 2, 3, 5, 8], ... 'c': [1, 4, 9, 16, 25, 36]}) df a b c 0 1 1 1 1 2 1 4 2 3 2 9 3 4 3 16 4 5 5 25 5 6 8 36 df.diff() a b c 0 NaN NaN NaN 1 1.0 0.0 3.0 2 1.0 1.0 5.0 3 1.0 1.0 7.0 4 1.0 2.0 9.0
5 1.0 3.0 11.0
与前一列的差异
1 2 3 4 5 6 7 8 df.diff(axis=1) a b c 0 NaN 0.0 0.0 1 NaN -1.0 3.0 2 NaN -1.0 7.0 3 NaN -1.0 13.0 4 NaN 0.0 20.0 5 NaN 2.0 28.0
与第3行的差异
1 2 3 4 5 6 7 8 df.diff(periods=3) a b c 0 NaN NaN NaN 1 NaN NaN NaN 2 NaN NaN NaN 3 3.0 2.0 15.0 4 3.0 4.0 21.0 5 3.0 6.0 27.0
与以下行的差异
1 2 3 4 5 6 7 8 df.diff(periods=-1) a b c 0 -1.0 0.0 -3.0 1 -1.0 -1.0 -5.0 2 -1.0 -1.0 -7.0 3 -1.0 -2.0 -9.0 4 -1.0 -3.0 -11.0 5 NaN NaN NaN
9、移动函数 9.1、移动函数shift 1 DataFrame.shift(periods=1, freq=None, axis=0, fill_value=<no_default>)
periods:表示移动的幅度,可正可负;默认值是1,1就表示移动一次。注意这里移动的都是数据,而索引是不移动的,移动之后没有对应值的,就赋值为NaN。
freq:DateOffset, timedelta, or time rule string,可选参数,默认值为None,只适用于时间序列。如果这个参数存在,那么会按照参数值移动时间索引,而数据值没有发生变化。
axis:表示按照哪个轴移动。axis=0表示index,横轴;axis=1表示columns,纵轴
fill_value:表示当我们数据发生了移动之后,产生的缺失值用什么数据填充。如果是数值型的缺失值,用np.nan;如果是时间类型的缺失值,用NaT(not a time)
10、时间连续性 但是存在一个问题,需要先按照时间排序,并且如果日期相同,也会判断错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import pandas as pd t={"DateAnalyzed":["2018-03-18","2018-03-19","2018-03-20","2017-01-20","2018-09-25","2018-09-26","2018-09-27"],"Val":[0.470253,0.470253,0.470253,0.485949,0.467729,0.467729,0.467729]} df=pd.DataFrame(t) df["DateAnalyzed"]=pd.to_datetime(df["DateAnalyzed"]) print(df.dtypes) dt = df['DateAnalyzed'] day = pd.Timedelta('1d') in_block = ((dt - dt.shift(-1)).abs() == day) | (dt.diff() == day) filt = df.loc[in_block] breaks = filt['DateAnalyzed'].diff() != day groups = breaks.cumsum() print(groups) for _, frame in filt.groupby(groups): print(frame, end='\n\n')
已解决时间连续性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import pandas as pd # t={"DateAnalyzed":["2018-03-18","2018-03-19","2018-03-20","2017-01-20","2018-09-25","2018-09-26","2018-09-27"],"Val":[0.470253,0.470253,0.470253,0.485949,0.467729,0.467729,0.467729]} df = pd.read_csv("all1.csv", index_col=None, header=0, error_bad_lines=False, encoding="gbk",parse_dates=True).copy() df["日志接收时间"] = pd.to_datetime(df["日志接收时间"]) df=df.sort_values("日志接收时间") dt = df['日志接收时间'] day = pd.Timedelta(minutes=1) day1 = pd.Timedelta(minutes=0) in_block = ((dt - dt.shift(1)).abs() == day) |((dt - dt.shift(1)).abs() == day1) b=(in_block==False) filt = df.loc[in_block] groups = b.cumsum() for _, frame in df.groupby(groups): print(frame, end='\n\n') 将TRUE和false颠倒 b=(in_block==False)
11、过滤 11.1、基本过滤 df[df[“size”]>=10] #过滤df的size字段中大于10的
11.2、过滤字段的某个值在一个列表中isin()
isin(),返回值为true false ,~取反
protocol=[“imap”] port=[“143.0”,”993.0”] #获取传输协议为imap的 df[(df[“传输协议”].isin(protocol))] #取反,获取目的端口不为143,993的 df[(df[“目的端口”].isin(port))]
11.3、获取多个字段的值 df[[‘源IP地址’, ‘目的IP地址’]]
12、算数方法 12.1、add df1.add(df2,fill_value=0)
方法
描述
范例
add | radd
加法
df1.add(df2)==df1+df2df1.radd(df2)==df2+df1
sub | rsub
减法
df1.sub(df2)==df1-df2df1.rsub(df2)==df2-df1
div | rdiv
除法
df1.div(df2)==df1/df2df1.div(1)==1/df1[可以是数字,如果表里都是数字]
floordiv | rfloordiv
整除
df1.loordiv(df2)==df1//df2df1.rloordiv(df2)==df2//df1
mul | rmul
乘法
df1.mul(df2)==df1df2df1.rmul(df2)==df2 df1
pow | rpow
幂次方
df1.pow(df2)==df1df2df1.rpow(df2)==df2 df1
12.2、常用函数 info[‘x’].max() #获取最大值 info[‘x’].min() #获取最小值 info.mean() #获取均值,获取列的均值
x=np.array([np.arange(5),np.arange(5),np.arange(3,8)]) df=pd.DataFrame(x) print(df.values) print(df.mean()) print(df[0].mean())
参考链接
pandas常用函数:https://www.cjavapy.com/article/388/
合并:https://www.jb51.net/article/231326.htm
时间连续性:https://www.cnblogs.com/zcsh/p/14790823.html
agg函数提供的聚合功能允许在一次计算中按组计算多个统计数据。语法很简单,聚合指令以字典或列表的形式提供。