python笔记——拼接、排序、字典保存、字典转换、iloc和loc、添加子图、频数统计图(自定义区间)

主要是针对遇到的一些问题进行总结。

1、拼接问题

对于numpy的array数组怎么实现拼接,主要是有两种函数np.hstack、np.vstack

另外还有c_、r_函数

concatenate()函数

concatenate()比append()效率更高,适合大规模的数据拼接,能够一次完成多个数组的拼接。

numpy.concatenate((a1,a2,...), axis=0)

其中a1,a2,...是数组类型的参数,传入的数组必须具有相同的形状。

axis 指定拼接的方向,默认axis = 0(逐行拼接)(纵向的拼接沿着axis= 1方向)。

注:一般axis = 0,就是对该轴向的数组进行操作,操作方向是另外一个轴,即axis=1。

a=np.array([1,2,3])
b=np.array([11,22,33])
c=np.array([44,55,66])
np.concatenate((a,b,c),axis=0)  # 默认情况下,axis=0可以不写
#结果:array([ 1,  2,  3, 11, 22, 33, 44, 55, 66]) 
#对于一维数组拼接,axis的值不影响最后的结果
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[11,21,31],[7,8,9]])
np.concatenate((a,b),axis=0)
'''
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [11, 21, 31],
       [ 7,  8,  9]])
'''
np.concatenate((a,b),axis=1)  #axis=1表示对应行的数组进行拼接
'''
array([[ 1,  2,  3, 11, 21, 31],
       [ 4,  5,  6,  7,  8,  9]])
'''

参考:https://blog.csdn.net/qq_29831163/article/details/90167774 

2、排序问题

主要是sort函数和sorted函数

一、sort()函数

描述

sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。

语法

sort()方法语法:

1 list.sort(cmp=None, key=None, reverse=False)

参数

  • cmp -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。

返回值

该方法没有返回值,但是会对列表的对象进行排序。

实例

以下实例展示了 sort() 函数的使用方法:

1 #!/usr/bin/python
2 # -*- coding: UTF-8 -*-
3  
4 aList = [123, 'Google', 'Runoob', 'Taobao', 'Facebook'];
5  
6 aList.sort();
7 print "List : ", aList

以上实例输出结果如下:

1

List :  [123'Facebook''Google''Runoob''Taobao']

以下实例降序输出列表:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 列表
vowels = ['e', 'a', 'u', 'o', 'i']
  
# 降序
vowels.sort(reverse=True)
 
# 输出结果
print '降序输出:', vowels

 

以上实例输出结果如下:

1

降序输出: ['u''o''i''e''a']

以下实例演示了通过指定列表中的元素排序来输出列表:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 获取列表的第二个元素
def takeSecond(elem):
     return elem[1]
 
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
 
# 指定第二个元素排序
random.sort(key=takeSecond)

# 输出类别
print '排序列表:', random

 

以上实例输出结果如下:

1

排序列表:[(41), (22), (13), (34)]

二、sorted()函数

描述

sorted() 函数对所有可迭代的对象进行排序操作。

1

2

3

sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

 

语法

sorted 语法:

1

sorted(iterable[, cmp[, key[, reverse]]])

参数说明:

  • iterable -- 可迭代对象。
  • cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回值

返回重新排序的列表。

实例

以下实例展示了 sorted 的使用方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

>>>a = [5,7,6,3,4,1,2]

>>> b = sorted(a)       # 保留原列表

>>> a

[5763412]

>>> b

[1234567]

  

>>> L=[('b',2),('a',1),('c',3),('d',4)]

>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))   # 利用cmp函数

[('a'1), ('b'2), ('c'3), ('d'4)]

>>> sorted(L, key=lambda x:x[1])               # 利用key

[('a'1), ('b'2), ('c'3), ('d'4)]

  

  

>>> students = [('john''A'15), ('jane''B'12), ('dave''B'10)]

>>> sorted(students, key=lambda s: s[2])            # 按年龄排序

[('dave''B'10), ('jane''B'12), ('john''A'15)]

  

>>> sorted(students, key=lambda s: s[2], reverse=True)       # 按降序

[('john''A'15), ('jane''B'12), ('dave''B'10)]

>>>

3、保存字典问题

pickle method
save a python object into a .plk file

import pickle

def save_obj(obj, name ):
    with open('obj/'+ name + '.pkl', 'wb') as f:
        pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)

def load_obj(name ):
    with open('obj/' + name + '.pkl', 'rb') as f:
        return pickle.load(f)

numpy method
save a python dictionary into a .npy file

import numpy as np

# Save
dictionary = {'hello':'world'}
np.save('my_file.npy', dictionary) 

# Load
read_dictionary = np.load('my_file.npy').item()
print(read_dictionary['hello']) # displays "world"

 

4、字典转化为pandas的dataframe

df = pd.DataFrame([dict0]).T

注意这个[],转置看个人需不需要

python 根据字典的键值进行排序

1、利用key排序

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,}
for k in sorted(d):
    print(k,d[k])

d1 2
d2 4
d3 3
d4 1

2、利用value排序:__getitem__

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,}
for k in sorted(d,key=d.__getitem__):
    print(k,d[k])

d4 1
d1 2
d3 3
d2 4

 

反序:reverse=True

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,}
for k in sorted(d,key=d.__getitem__,reverse=True):
    print(k,d[k])

d2 4
d3 3
d1 2
d4 1

3、对dict_items进行排序

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,}
res = sorted(d.items(),key=lambda d:d[1],reverse=True)
print(res)

 [('d2', 4), ('d3', 3), ('d1', 2), ('d4', 1)]

5、iloc和loc问题

loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为"A"的行)

iloc函数:通过行号来取行数据(如取第二行的数据)

本文给出loc、iloc常见的五种用法,并附上详细代码。

1. 利用loc、iloc提取行数据
import numpy as np
import pandas as pd
#创建一个Dataframe
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
 
In[1]: data
Out[1]: 
    A   B   C   D
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
 
#取索引为'a'的行
In[2]: data.loc['a']
Out[2]:
A    0
B    1
C    2
D    3
 
#取第一行数据,索引为'a'的行就是第一行,所以结果相同
In[3]: data.iloc[0]
Out[3]:
A    0
B    1
C    2
D    3
 

2. 利用loc、iloc提取列数据
In[4]:data.loc[:,['A']] #取'A'列所有行,多取几列格式为 data.loc[:,['A','B']]
Out[4]: 
    A
a   0
b   4
c   8
d  12
 
In[5]:data.iloc[:,[0]] #取第0列所有行,多取几列格式为 data.iloc[:,[0,1]]
Out[5]: 
    A
a   0
b   4
c   8
d  12
 
3.利用loc、iloc提取指定行、指定列数据
In[6]:data.loc[['a','b'],['A','B']] #提取index为'a','b',列名为'A','B'中的数据
Out[6]: 
   A  B
a  0  1
b  4  5
 
In[7]:data.iloc[[0,1],[0,1]] #提取第0、1行,第0、1列中的数据
Out[7]: 
   A  B
a  0  1
b  4  5
 

4.利用loc、iloc提取所有数据
In[8]:data.loc[:,:] #取A,B,C,D列的所有行
Out[8]: 
    A   B   C   D
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
 
In[9]:data.iloc[:,:] #取第0,1,2,3列的所有行
Out[9]: 
    A   B   C   D
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
5.利用loc函数,根据某个数据来提取数据所在的行
In[10]: data.loc[data['A']==0] #提取data数据(筛选条件: A列中数字为0所在的行数据)
Out[10]: 
   A  B  C  D
a  0  1  2  3
利用loc函数的时候,当index相同时,会将相同的Index全部提取出来,优点是:如果index是人名,数据框为所有人的数据,那么我可以将某个人的多条数据提取出来分析;缺点是:如果index不具有特定意义,而且重复,那么提取的数据需要进一步处理。

同样:at与iat函数可抽取指定行列的值,详情见博文(DataFrame中at、iat函数详解)

6、添加多个子图

plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为微软雅黑
fig = plt.figure()
# 画个图看看数据
for j in range(8):
    ax = fig.add_subplot(241 + j)
    ax.plot(range(len(df.iloc[:, j])), df.iloc[:, j], c='r')

7、频率频数统计

fig=plt.figure()
wendu.value_counts(bins=50, sort=False).plot(kind='bar')#就50个柱形图

#自己创建一个分组
fig=plt.figure()
fanwei=list(range(40,90,2))
fenzu=pd.cut(wendu.values,fanwei,right=False)#分组区间
pinshu=fenzu.value_counts()#series,区间-个数
pinshu.plot(kind='bar')
plt.show()

https://blog.csdn.net/castinga3t/article/details/79075240

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值