pandas数据分析-常用命令

pandas数据分析-常用命令,第1张

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10129821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存