迄今为止在python数据分析相关库上遇到的坑,超长预警
source .bashrc
source activate base
先激活base环境
再jupyter notebook
启动jupyter notebook!先前anaconda安装的包都是在base环境下的!
在jupyter中sys.path
就可以看出环境对没对!如果不是指定anaconda3中(我安装的)环境,那就没对!
查看anconda3有哪些环境conda info --envs
- .ipynb文件转.py文件
jupyter nbconvert --to script demo.ipynb
for i in (a,b)
for i in range(a,b)
别搞混了!
且range左闭右开black10w.drop(black10w[black10w['Filename']==filename].index,axis=0,inplace=True)
去掉dataframe中文件名为filename的那一行virtualenv --python=/usr/bin/python3.5 --no-site-packages envNAME
用此命令建立新的python环境,并使用系统的python3.5
http://www.cnblogs.com/freely/p/8022923.html+见20181123的周记
drop函数是个返回值! pandas里好多函数都是返回值形式!一定勿忘赋值回去!不然不会改变
df = df.drop(list)
drop掉list中索引的内容,默认drop行(axis=0)
如df=df.drop([0])
就是把第0行去掉
如果设置axis=1就是去掉列 索引可以不一定是序号 列用str索引那么列表里的元素就是list即可!drop
掉指定行之后,不会自己重新索引! 要手动重新索引!df = df.reset_index(drop = True)
也可以直接修改列索引df = pd.DataFrame(df,columns = ['One','Two','Three'])
(如果不需要用索引刻意不重建)pandas中的
append()
函数也是个返回值!df=df.append(x)
在append
两个dataframe之后,索引可能就乱了!要在append里加参数ignore_index=True
即可自动重建索引df=df.append(x,ignore_index=True)
但是,非pandas库中的不一定是!比如对于list,不在pandas中,则必须直接
list.append()
iloc函数是按行数(编号)的!而不是index索引,即使drop后 index没有被重新排列,iloc也是从1开始数来定位
drop函数是drop的对应index,而不是编号! 比如 a b c 0 1 6 4 1 2 7 4 2 3 8 5 drop掉1后就变成 a b c 0 1 6 4 2 3 8 5 而这时候iloc[2]就out of bonud了,因为编号2已经不在了,在的是index2
但是 loc是按索引取号!
即使这行删了,他也不会out of bonud 因为想要的索引那行并没有被删!
所以在循环删除满足条件的行的时候,要用loc来删除!因为删除行后每行的索引是不变的!但行号是会变的!iloc是按行号来算的,所以就会出错!
drop(x)
这里x是索引而不是行号item = ‘t2_asd’
item[0:3]
输出:t2_
截取和range一样,也是左闭右开feaMatrix[:,'a']
等效于feaMatrix.a
DataFrame.values
values是DataFrame的一个特殊属性,得到一个array包含每一行的值(一个list) columns和rows也是DF的特殊属性,分布得到Index类型的列索引和行索引 如果feaMatrix.columns.values则得到array类型的列索引列表和行索引列表 >>feaMatrix.columns.values array(['a', 'b'], dtype=object)
切片和range都是左闭右开!!!!!
切片的时候 行用:而列不能用:
矩阵合并
可以用merge和append,都属于pandas库pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False)
left︰ 对象
right︰ 另一个对象
on︰ 要加入的列 (名称)。必须在左、 右综合对象中找到。如果不能通过 left_index 和 right_index 是假,将推断 DataFrames 中的列的交叉点为连接键
left_on︰ 从左边的综合使用作为键列。可以是列名或数组的长度等于长度综合
right_on︰ 从正确的综合,以用作键列。可以是列名或数组的长度等于长度综合
left_index︰ 如果为 True,则使用索引 (行标签) 从左综合作为其联接键。在与多重 (层次) 的综合,级别数必须匹配联接键从右综合的数目
right_index︰ 相同用法作为正确综合 left_index
how︰ 之一 ‘左’,’右’,’外在’、 ‘内部’。默认为内部。每个方法的更详细说明请参阅︰
sort︰ 综合通过联接键按字典顺序对结果进行排序。默认值为 True,设置为 False将提高性能极大地在许多情况下
suffixes︰ 字符串后缀并不适用于重叠列的元组。默认值为 (‘_x’,’_y’)。
copy︰ 即使重新索引是不必要总是从传递的综合对象,复制的数据 (默认值True)。在许多情况下不能避免,但可能会提高性能 / 内存使用情况。可以避免复制上述案件有些病理但尽管如此提供此选项。
indicator︰ 将列添加到输出综合呼吁 _merge 与信息源的每一行。_merge 是绝对类型,并对观测其合并键只出现在 ‘左’ 的综合,观测其合并键只会出现在 ‘正确’ 的综合,和两个如果观察合并关键发现在两个 right_only left_only 的值。
eg:result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
遇见大坑:
合并中发生排列组合问题!
当两个要合并的dataframe里合并关键字有重名项的时候,将会发生排列组合!a b 1 0 1 2 a c d 1 1 5 1 2 6 按a合并,结果是 a b c d 1 0 1 5 1 0 2 6 1 2 1 5 1 2 2 6
矩阵检索
#对于两个矩阵,找同一项的另一项,直接找速度非常慢。可以采用矩阵合并之后,再搜索 df.loc[df.Filename==filename, 'label'] = 1 tencent[tencent.Filename == '5F94E5453CF23ACBF0256575D629A442'] #以上两种都可以找
- dataframe删除行或列
用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False) 在这里默认:axis=0,指删除index,因此删除columns时要指定axis=1; inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe; inplace=True,则会直接在原数据上进行删除操作,删除后就回不来了。 eg: tencent = tencent.drop([tencent[tencent.Filename == '6A6709AA7F9DF362CF90D2DE063D1FFF'].index.values[0]],inplace=True) #这里tencent[tencent.Filename == '6A6709AA7F9DF362CF90D2DE063D1FFF'] 找到了该行,.index.values[0]]取出了索引号,然后由drop函数去drop,inplace=True重建索引,然后赋值回给tencent ################################## >>>df = pd.DataFrame(np.arange(12).reshape(3,4), columns=['A', 'B', 'C', 'D']) >>>df A B C D 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 #Drop columns,下面两种方法等价 >>>df = df.drop(['B', 'C'], axis=1) A D 0 0 3 1 4 7 2 8 11 >>>df = df.drop(columns=['B', 'C']) A D 0 0 3 1 4 7 2 8 11 #Drop rows by index >>>df = df.drop([0, 1]) A B C D 2 8 9 10 11
对于
index
类型,可以用index.values
转化为array类型
.values
是什么属性JSON和字典
[JSON]和[字典]的标准格式是用{}
包起来的内容!必须要有外面的{}dict = eval(str)
可以将字符串转化为字典inplace
inplace参数的理解: 修改一个对象时: inplace=True:不创建新的对象,直接对原始对象进行修改; inplace=False:对数据进行修改,创建并返回新的对象承载其修改结果。
python中list转字符串
命令:’’.join(list)
其中,引号中是字符之间的分割符,如“,”,“;”,“\t”等等
如:
list = [1, 2, 3, 4, 5]
‘’.join(list) 结果即为:12345
‘,’.join(list) 结果即为:1,2,3,4,5json函数库
import json dict = json.loads(string) #即可将string转换为json,其中里面的一切格式问题都不用管,json.loads全部解决
- python分割
除了用split
方法以外,还可以用正则表达式实现多规则分割import re a = "Hello world!How are you?My friend.Tom" re.split(" !|\?|\.", a) ['Hello', 'world', 'How', 'are', 'you', 'My', 'friend', 'Tom'] ''' 但要注意,对? ( ) . 等字符分割的时候要转义,即要写 \. \( \) \? '''
append的时候勿忘
ignore_index = True
否则索引就凉了!python广播
numpy广播使得不同数组间可以进行运算
如一个向量+一个常数的时候,常数会被自动扩展成一个向量
见松鼠书P435numpy向量化计算
尽量少使用显式循环
用向量化(并行运算) 即将元素作为向量进行计算
numpy.dot(x,y)
numpy.exp(v)
等等 numpy有很多向量化函数
即为点乘
平时计算的时候也可以直接用向量化计算,速度快很多numpy中常用reshape来确保数组的形式
a.T
转置numpy.random.randn(5)
随机生成矩阵 15 注意生成的只有一个[]numpy.random.randn(1,5)
随机生成矩阵 注意生成的是[[]] ==用这个
(numpy array格式)
*不要用上面那种写法,容易出错!不直观,它既不是行向量也不是列向量不要吝惜使用
reshape
assert(表达式)
语句用于检查表达式是否正确,如果不正确程序在这里引发错误
方便检查list.append()
不需要a = a.append()改变DATAFRAME的顺序
order = ['date', 'time', 'open', 'high', 'low', 'close', 'volumefrom', 'volumeto'] df = df[order]
Dataframe遍历
不能用for Line in DataFrame
来遍历!
要么用iloc index方法for i in range(0, len(df)): print df.iloc[i]['c1'], df.iloc[i]['c2']
要么用iterrows(https://blog.csdn.net/ls13552912394/article/details/79349809)
排序不成功问题
问题:遇到排序问题,使用下面的语句对pandas的某列进行排序时,发现根本没排序成功。
bada_air.sort_value(by=’time’,ascending=False)
解决方案:这里牵扯到很重要的参数inplace,默认的inplace设置是False,并没有对本体进行覆盖,所以解决方法有两个:
1.设置本体覆盖,令inplace=True
bada_air.sort_value(by=’time’,ascending=False,inplace=True)
2.设置传值覆盖
bada_air=bada_air.sort_value(by=’time’,ascending=False)pd.read_csv出现Unnamed:0这一列
解决办法:pd.read_csv(path,index_col=0)记清楚
loc[行限制,列限制]
比如行限制就可以A=A.loc[A.Filename = ‘aaa’,:]
或者其他选法等等合并 merge join 等的用法
https://www.jianshu.com/p/5ecea164cec6错点! series别忘了转成list 再用in! a in list O a in Series X
df1=df2 传递的不是指针,而是内容复制了一份
关于drop
- drop是drop的索引
- 注意drop属于panda 要用df = df.drop(x)
- inplace=True参数设置重建索引,df = df.drop(x,inplace=True)
重建索引
df = df.reset_index(drop = True)修改DF某元素(最终选择方法二)
一。
一个大坑
在修改df元素的时候,iloc和loc有重大区别!
loc和iloc都可以进行切片,但是用iloc不可以修改切片中的元素!
loc可以修改切片中的元素!test = pd.DataFrame({'a':[3,4,5,6],'b':[6,7,8,9]}) test['c']=0 test.iloc[2].c+=2 #用iloc test >> a b c 0 3 6 0 1 4 7 0 2 5 8 0 3 6 9 0 test = pd.DataFrame({'a':[3,4,5,6],'b':[6,7,8,9]}) test['c']=0 test.loc[2].c+=2 #用loc test >> a b c 0 3 6 0 1 4 7 0 2 5 8 2 3 6 9 0
二。但是!! 在很多情况下 这样还是无法修改!!!!
所以用这个方法!!
不用loc iloc 先选列索引 再选行索引!test['c'][2]+=2
统一使用此方法!test = pd.DataFrame({'a':[3,4,5,6],'b':[6,7,8,9]}) test['c']=0 test['c'][2]+=2 #看这里!!!!!!!!!!!!!!!! test >> a b c 0 3 6 0 1 4 7 0 2 5 8 2 3 6 9 0
在处理大批量数据时,如果需要先向df对象插入空列,在后期再填充空列中对应位置的元素,应优先考虑使用loc而不是iloc,因为前者的访问速度比后者快几十倍
dict排序
https://www.cnblogs.com/dylan-wu/p/6041465.htmldict = sorted(dict.items(),key=lambda item:item[1],reverse=True) # items()将dict转化为迭代器,lambda正咋表达式,item[1]即为迭代器的第二项
判断nan
math.isnan(x) #x得是float类型 type(x) != float #用类型判断,因为nan属于float类型
python取数据! python搜索数据 重要总结!
https://www.jianshu.com/p/805f20ac6e06python搜索数据的时候 这种情况要用isin
allDatasetApiCorpus[allDatasetApiCorpus['Filename'].isin(list)]
- Series可以直接与int比大小,等于对每一项比大小!
eg: lis = [1,2,3,-1,-2,-3] lis = pd.Series(lis) lis[lis>0] >> 0 1 1 2 2 3 dtype: int64 lis>0 >> 0 True 1 True 2 True 3 False 4 False 5 False dtype: bool
- 枚举 enumerate的用法
lis = [1,2,3,-1,-2,-3] for index, var in enumerate(lis): print(index,' ',var) >> 0 1 1 2 2 3 3 -1 4 -2 5 -3
- 元组可以这样用
s = (2,1) s[0] >>2
转置
narray.T, dataframe.T
去重
drop_duplicates()
drop_duplicates()
是去除重复行,要想去除重复列要先转置DataFrame = DataFrame.drop_duplicates(subset=None, keep='first', inplace=False) ''' subset : column label or sequence of labels, optional 用来指定特定的列,默认所有列(指的是以哪些列为参考删除行,删的还是行) keep : {‘first’, ‘last’, False}, default ‘first’ 删除重复项并保留第一次出现的项 inplace : boolean, default False 是直接在原来数据上修改还是保留一个副本 '''
- 初始化列表 list
# 一维列表 # 初始化递增的list,与L = [i for i in range(10)] 效果相同 L = range(10) # print(L) # [0,1,2,3,4,5,6,7,8,9] #初始化每项为0的一维列表 L = [0] * 5 # print(L) #[0,0,0,0,0] # 二维列表 L = [[0] * 5 for i in range(5)] #print(L) #[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] #这里需要注意,虽然L = [[0] * 5] * 5,也输出同样的效果,但是万万不能这样做! #因为[0] * 5是一个一维列表的对象,再* 5的话只是把对象的引用复制了3次。什么意思呢,就是如果我们将L[0][0] = 1,#再输出L如下: L = [[0] * 5] * 5 L[0][0] = 1 #print(L) #[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]] #我们只是想改变L[0][0],结果L[[n][0]全部改变了!这回知道为啥不能这么做了吧! #所以对于一位列表初始化,也建议大家用L = [[0] for i in range(5)]来代替L = [[0] * 5]
- Numpy扁平化函数 ravel和flatten
from numpy import * a = arange(12).reshape(3,4) print(a) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] print(a.ravel()) # [ 0 1 2 3 4 5 6 7 8 9 10 11] print(a.flatten()) # [ 0 1 2 3 4 5 6 7 8 9 10 11] 可以看到这两个函数实现的功能一样,但我们在平时使用的时候flatten()更为合适.在使用过程中flatten()分配了新的内存,但ravel()返回的是一个数组的视图.视图是数组的引用(说引用不太恰当,因为原数组和ravel()返回后的数组的地址并不一样),在使用过程中应该注意避免在修改视图时影响原本的数组.
[confusion_matrix - too many values to unpack]
you can only assign multiple variables dynamically if the number of outputs is certain. If you assign the result of `confusion_matrix` to a single variable, you can then check its contents in a loop and assign the contents conditionally: returned = confusion_matrix(y_true, y_predict).ravel() for var in returned: #... do stuff with each item in the returned collection You could also just check its length and if it is 4, you can proceed as usual: if len(returned) == 4: tn, fp, fn, tp = returned
遍历dataframe
for col in df
遍历的是列标签
要遍历行有几种方案https://blog.csdn.net/ls13552912394/article/details/79349809
遍历这种东西在df选取等操作中不是一个好的解决方案,可以通过df的搜索loc iloc等很多方式来实现,比遍历好得多方便的多python list去重
运用set的特性opList = list(set(opList))
切片的时候若不存在
msgTrojanDynamicDF.loc[:,[‘android.content.Intent_setAction’,’sss’] ]
其中如果sss不存在,则sss列全为NaN
但如果两列都不存在,就会报错Series.sum(axis-1)可以统计竖向的和
拼接dataframe
df = pd.concat([A,B,C])
numpy.transpose 用于翻转
https://blog.csdn.net/u012762410/article/details/78912667torch.cat 拼接Tensor
torch.cat((a,b),1)`转置
np.transpose()
torch.transpose()
左闭右开
注意python各个库的左闭右开原则 [:]切片的时候注意! range,list,numpy,pandas,torch都这样将数据结构转化为集合可以自动去重!(#去重)
a = set(a)
set(1,2,3) = set(1,1,1,1,1,1,2,3)
tensor,numpy array的创建与扩展
#创建 np.zeros([3,10]) #创建一个3x10的array torch.zeros(3,10) #创建一个3x10的tensor list([0])*10 #[10,10,10,10,10,10,10,10,10,10] list([[0]*10]*3) #创建一个3x10的list np.random.rand(3,10) #随机创建一个3x10的array torch.rand(3,10) #随机创建一个3x10的tensor #合并/拓展 a.extend([4,5]) #[1,2,3,4,5] #注意用法 extend后保存的值就为a,和append用法类似 removes = np.append(array1,array2,axis=0) #axis为合并的维度 tensor 使用torch.stack进行合并
list 删除元素
list.remove(x) print(list)
该方法没有返回值
只会删掉匹配到的第一个
还有2个方法懒得记了python remove里有个巨坑!
如果用for循环来remove的话,for循环的时候,每删除一个元素,长度就会改变,索引就会变化!所以remove就会出问题!
比如 要依次删除1,2位置的元素。
第一次删除了1位置,那么列表索引就变了,2元素成为了1元素,3元素成为了2元素!2元素就这样被跳过了!
解决办法见下for循环 动态修改列表的时候的注意事项
如何解决:deepcopy一份,一个列表用于循环,一个列表用于移除值
(from copy import deepcopy
)调换维度。
使用numpyarrray.swapaxes(ax0,ax1)numpy.size()函数
a = np.array(…)
np.size(a) 计算数组和矩阵所有数据的个数
np.size(a,1)计算该array第1维(第一个维度为0)的元素个数tensor/array值归一化
tensor.div_()
narray.div_()
windows路径\\变成/即可
改变numpy array中的数据类型
array = array.astype(obj_type)
obj_type
就可以为比如float