order = ['id','msg','reason']
df = df[order]
常用:
dfrename(columns={'A':'a','B':'b'},inplace=True)(inplace说明修改原数据)
高级用法示例:大写转成小写,去除头尾空格(strip)用 替换空格
dfrename(columns=lambda x:xstrip()lower()replace(' '," "),inplace=True)
检查冗余值 dfduplicated()
删除冗余值 dfdrop_duplicates(inplace=True)
dfreset_index()
test=pdDataFrame(msg)
lambda x: 1 if x>0 else 0
df = pdconcat([df,msg],axis=0,ignore_index=True)
pdmerge(df1,df2) 相当于sql, join的左连接
str[0:4] #截取第一位和第四位的字符
str[:-1] #截取从开头到倒数第一位的字符
for i,val in range(len(temp)):
for i,val in enumerate(temp):
df[dfisnull()values==True]drop_duplicates()
append()向列表尾部追加一个元素,只占一个索引位
extend()像列表尾部追加一个李彪,将列表2中 的每个元素都追加进列表1
str=','join(str(i)for i in list)
eval(str)
df1 = df2groupby(['ip'])aggregate(lambda x:set(x))
for i in data:
def timeStamp(timeNum):
timeStamp = float(timeNum/1000)
timeArray = timelocaltime(timeStamp)
otherStyleTime = timestrftime("%Y%m%d", timeArray)
return otherStyleTime
df= dfastype('str')
import json
with open('psth','r') as load_f:
load_dict = jsonload(load_f)
ioc_list=[]
for k,v in load_dictitems():
"""
Createdon Mon Jul 8 22:05:32 2019
@author:
same3
"""
我们通过Xlwings 调用 Excel特定区域的数据集,将用来测试Panda对于None值/NaN/null/空值(以下统称空值)的处理,本次我们将会学到:
对含有空值的DataFrame进行各种选择 *** 作,以及对空值数据的填充fillna()、删除dropna(),我们将在后面陆续介绍。
笔者是技术进步的拥趸,Python 的IDE:Spyder,从刚开始是Python(x,y)的作者为Python开发的一个简单的集成开发环境,发展到现在V40白、富、美的开发环境,着实令人惊艳!感谢这个世界上众多无私付出、默默耕耘的人们,有了你们,世界越来越好!
和其他的Python开发环境相比,Spyder最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改对象的值。
学习使用spyder(python IDE)
参考资料:
透视表pivot_table()是非常强大的汇总运算函数。 在SQL语句和excel中透视表也是非常普遍的。
pivot_table()的主要参数有:
源数据:
使用pivot_table()进行透视表 *** 作:
values是要进行汇总、统计等运算的列,可以是多个(list格式);
index是作为新表的列名,可以是多个(list格式);
columns是作为新表的列名,可以是多个(list格式);
aggfunc是做汇总的统计运算方法,常用的简单运算都可以,也可以是多种方法(每个不同的列指定一种方法),这样就可以免去了多次使用透视表在进行合并的麻烦。
使用多种计算方法:
# 有趣的是 多个汇总方法如果用aggfunc=['sum','count'],就会报错 。而如果用numpy库的方法就正常(没有count函数)。
在不同的列使用不同的运算方法,可以使 用字典的形式 表明汇总方法:
不过这个跟excel的透视表相比还是缺少了一个汇总行,我们可以 使用margins=True来添加行列合计 :
还可以使用margins_name=' '来修改汇总行列的名称,当然了也可以使用rename()来修改:
fill_value = 0 是用来填充缺失值、空值。
dropna=True 是跳过整行都是空缺值的行。
这样我们就把pivot_table()的参数都介绍了,pivot_table是经常使用的一个函数,结合简单的计算函数一起使用会有很好的效果。
我们还可以把经过pivot_table()处理过的数据导出到电脑的excel文件里:
1、引入工具–加载数据分析包
启动IPython notebook,加载运行环境:
%matplotlib inline
import pandas as pd
from datetime import timedelta, datetime
import matplotlibpyplot as plt
import numpy as np
2、数据准备
俗话说: 巧妇难为无米之炊。小安分析的数据主要是用户使用代理IP访问日志记录信息,要分析的原始数据以CSV的形式存储。这里首先要介绍到pandasread_csv这个常用的方法,它将数据读入DataFrame
analysis_data = pdread_csv('/honeypot_datacsv')
对的, 一行代码就可以将全部数据读到一个二维的表结构DataFrame变量,感觉很简单有木有啊!!!当然了用Pandas提供的IO工具你也可以将大文件分块读取,再此小安测试了一下性能,完整加载约21530000万条数据也大概只需要90秒左右,性能还是相当不错。
3、数据管窥
一般来讲,分析数据之前我们首先要对数据有一个大体上的了解,比如数据总量有多少,数据有哪些变量,数据变量的分布情况,数据重复情况,数据缺失情况,数据中异常值初步观测等等。下面小安带小伙伴们一起来管窥管窥这些数据。
使用shape方法查看数据行数及列数
analysis_datashape
Out: (21524530, 22) #这是有22个维度,共计21524530条数据记的DataFrame
使用head()方法默认查看前5行数据,另外还有tail()方法是默认查看后5行,当然可以输入参数来查看自定义行数
analysis_datahead(10)
这里可以了解到我们数据记录有用户使用代理IP日期,代理header信息,代理访问域名,代理方法,源ip以及蜜罐节点信息等等。在此小安一定一定要告诉你,小安每次做数据分析时必定使用的方法–describe方法。pandas的describe()函数能对数据进行快速统计汇总:
对于数值类型数据,它会计算出每个变量: 总个数,平均值,最大值,最小值,标准差,50%分位数等等;
非数值类型数据,该方法会给出变量的: 非空值数量、unique数量(等同于数据库中distinct方法)、最大频数变量和最大频数。
由head()方法我们可以发现数据中包含了数值变量、非数值变量,我们首先可以利用dtypes方法查看DataFrame中各列的数据类型,用select_dtypes方法将数据按数据类型进行分类。然后,利用describe方法返回的统计值对数据有个初步的了解:
dfselect_dtypes(include=['O'])describe()
dfselect_dtypes(include=['float64'])describe()
简单的观察上面变量每一维度统计结果,我们可以了解到大家获取代理数据的长度平均1670个字节左右。同时,也能发现字段scanossubfp,scanscan_mode等存在空值等等信息。这样我们能对数据整体上有了一个大概了解。
4、数据清洗
由于源数据通常包含一些空值甚至空列,会影响数据分析的时间和效率,在预览了数据摘要后,需要对这些无效数据进行处理。
一般来说,移除一些空值数据可以使用dropna方法, 当你使用该方法后,检查时发现 dropna() 之后几乎移除了所有行的数据,一查Pandas用户手册,原来不加参数的情况下, dropna() 会移除所有包含空值的行。
如果你只想移除全部为空值的列,需要加上 axis 和 how 两个参数:
analysis_datadropna(axis=1, how='all')
另外,也可以通过dropna的参数subset移除指定列为空的数据,和设置thresh值取移除每非None数据个数小于thresh的行。
analysis_datadropna(subset=['proxy_host', 'srcip'])
#移除proxy_host字段或srcip字段没有值的行
analysis_datadropna(thresh=10)
#移除所有行字段中有值属性小于10的行
5、统计分析
再对数据中的一些信息有了初步了解过后,原始数据有22个变量。从分析目的出发,我将从原始数据中挑选出局部变量进行分析。这里就要给大家介绍pandas的数据切片方法loc。
loc([startrowindex:endrowindex,[‘timestampe’, ‘proxy_host’, ‘srcip’]])是pandas重要的切片方法,逗号前面是对行进行切片;逗号后的为列切片,也就是挑选要分析的变量。
如下,我这里选出日期,host和源IP字段——
analysis_data = analysis_dataloc([:, [‘timestampe’,'proxy_host','srcip']])
首先让我们来看看蜜罐代理每日使用数据量,我们将数据按日统计,了解每日数据量PV,并将结果画出趋势图。
daily_proxy_data = analysis_data[analysis_datamodule=='proxy']
daily_proxy_visited_count = daily_proxy_datatimestampvalue_counts()sort_index()
daily_proxy_visited_countplot()
对数据列的丢弃,除无效值和需求规定之外,一些表自身的冗余列也需要在这个环节清理,比如说DataFrame中的index号、类型描述等,通过对这些数据的丢弃,从而生成新的数据,能使数据容量得到有效的缩减,进而提高计算效率。
由上图分析可知蜜罐代理使用量在6月5号,19-22号和25号这几天呈爆炸式增长。那么这几天数据有情况,不正常,具体是神马情况,不急,后面小安带大家一起来慢慢揪出来到底是那些人(源ip) 干了什么“坏事”。
进一步分析, 数据有异常后,再让我们来看看每天去重IP数据后量及其增长量。可以按天groupby后通过nunique()方法直接算出来每日去重IP数据量。
daily_proxy_data = analysis_data[analysis_datamodule=='proxy']
daily_proxy_visited_count = daily_proxy_datagroupby(['proxy_host'])srcipnunique()
daily_proxy_visited_countplot()
究竟大部分人(源ip)在干神马干神马干神马让我们来看看被访问次数最多host的哪些,即同一个host关联的IP个数,为了方便我们只查看前10名热门host。
先选出host和ip字段,能过groupby方法来group 每个域名(host),再对每个域名的ip访问里unique统计。
host_associate_ip = proxy_dataloc[:, ['proxy_host', 'srcip']]
grouped_host_ip = host_associate_ipgroupby(['proxy_host'])srcipnunique()
print(grouped_host_ipsort_values(ascending=False)head(10))
再细细去看大家到底做了啥——查看日志数据发现原来在收集像二手车价格,工人招聘等等信息。从热门host来看,总得来说大家使用代理主要还是获取百度,qq,Google,Bing这类妇孺皆知网站的信息。
下面再让我们来看看是谁用代理IP“干事”最多,也就是看看谁的IP访问不同host的个数最多。
host_associate_ip = proxy_dataloc[:, ['proxy_host', 'srcip']]
grouped_host_ip = host_associate_ipgroupby(['srcip'_host'])proxy_hostnunique()
print(grouped_host_ipsort_values(ascending=False)head(10))
哦,发现目标IP为123155的小伙子有大量访问记录, 进而查看日志,原来他在大量收集酒店信息。 好了,这样我们就大概能知道谁在干什么了,再让我们来看看他们使用proxy持续时长,谁在长时间里使用proxy。 代码如下——
这里不给大家细说代码了,只给出如下伪代码。
date_ip = analysis_dataloc[:,['timestamp','srcip']]
grouped_date_ip = date_ipgroupby(['timestamp', 'srcip'])
#计算每个源ip(srcip)的访问日期
all_srcip_duration_times =
#算出最长连续日期天数
duration_date_cnt = count_date(all_srcip_duration_times)
好了,到此我也就初略的知道那些人做什么,谁用代理时长最长等等问题额。取出ip = 8038的用户使用**访问数据日志,发现原来这个小伙子在长时间获取搜狐images。
蜜罐在全国各地部署多个节点,再让我们来看看每个源ip扫描蜜罐节点总个数,了解IP扫描节点覆盖率。结果见如下:
# 每个IP扫描的IP扫描节点总个数
node = df[dfmodule=='scan']
node = nodeloc[:,['srcip','origin_details']]
grouped_node_count = nodegroupby(['srcip'])count()
print grouped_node_countsort_values(['origin_details'], ascending=False)head(10)
由上述两表初步可知,一些结论:如源ip为182205的用户长时间对蜜罐节点进行扫描,mark危险用户等等。
1、在pandas中,我们采用了R语言中的惯用法,即将缺失值表示为NA,它表示不可用not available。
2、pandas项目中还在不断优化内部细节以更好处理缺失数据。
3、过滤掉缺失数据的办法有很多种。可以通过pandasisnull或布尔索引的手工方法,但dropna可能会更实用一些。对于一个Series,dropna返回一个仅含非空数据和索引值的Series。
4、而对于DataFrame对象,可能希望丢弃全NA或含有NA的行或列。dropna默认丢弃任何含有缺失值的行。
5、最后通过一个常数调用fillna就会将缺失值替换为那个常数值,若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值。这样就完成了。
null/None/NaN
null经常出现在数据库中
None是Python中的缺失值,类型是NoneType
NaN也是python中的缺失值,意思是不是一个数字,类型是float
在pandas和Numpy中会将None替换为NaN,而导入数据库中的时候则需要把NaN替换成None
找出空值
isnull()
notnull()
添加空值
numeric容器会把None转换为NaN
In [20]: s = pdSeries([1, 2, 3])
In [21]: sloc[0] = None
In [22]: s
Out[22]:
0 NaN
1 20
2 30
dtype: float641234567891012345678910
object容器会储存None
In [23]: s = pdSeries(["a", "b", "c"])
In [24]: sloc[0] = None
In [25]: sloc[1] = npnan
In [26]: s
Out[26]:
0 None
1 NaN
2 c
dtype: object123456789101112123456789101112
空值计算
arithmetic operations(数学计算)
NaN运算的结果是NaN
statistics and computational methods(统计计算)
NaN会被当成空置
GroupBy
在分组中会忽略空值
清洗空值
填充空值
fillna
DataFramefillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, kwargs)
参数
value : scalar, dict, Series, or DataFrame
method : {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None(bfill使用后面的值填充,ffill相反)
axis : {0 or ‘index’, 1 or ‘columns’}
inplace : boolean, default False
limit : int, default None
downcast : dict, default is None
返回值
filled : DataFrame
Interpolation
replace
删除空值行或列
DataFramedropna(axis=0, how=’any’, thresh=None, subset=None, inplace=False)
参数
axis : {0 or ‘index’, 1 or ‘columns’}, or tuple/list thereof
how : {‘any’, ‘all’}
thresh : int, default None
subset : array-like
inplace : boolean, default False
返回
dropped : DataFrame
以上就是关于pandas数据分析-常用命令全部的内容,包括:pandas数据分析-常用命令、2019-12-13 (一)使用Xlwings从Excel,取数至Pandas的DataFrame和Series、20、pandas的透视表pivot_table等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)