主要是针对遇到的一些问题进行总结。
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 |
|
以下实例降序输出列表:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 列表
vowels = ['e', 'a', 'u', 'o', 'i']
# 降序
vowels.sort(reverse=True)
# 输出结果
print '降序输出:', vowels
以上实例输出结果如下:
1 |
|
以下实例演示了通过指定列表中的元素排序来输出列表:
#!/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 |
|
二、sorted()函数
描述
sorted() 函数对所有可迭代的对象进行排序操作。
1 2 3 |
|
语法
sorted 语法:
1 |
|
参数说明:
- 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 |
|
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