0%

python黑魔法

让python更实用一些~

记录一些黑魔法,比如正则表达式,或者各种库的应用,虽然感觉日后可能并无卵用。

暂时收录:

  • pandas 对多属性约束下的数据筛选(比如接收到一份excel数据后对数据的快速清洗)。
  • numpy的广播机制。
  • pandas 将数据写入同一个excel文件的多个sheet表。
  • numpy存取csv文件
  • 在需要多次写入csv文件的情况下,如何保持不会产生空行

停止更新,并无卵用。(日后这里会记录numpy和pandas,等我用熟了再说)

如果对本文有疑问或者想找男朋友,可以联系我,点击此处有我联系方式


pandas数据清洗

同时筛选属性COUNTY取值为BLAND和属性State取值为VA的数据,并且将筛选的多组数据写入同一个excel文件的不同sheet表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd

df = pd.read_excel('MCM_NFLIS_Data.xlsx', 'Data')
VA = df.loc[df['State'] == 'VA']
OH = df.loc[df['State'] == 'OH']
# 同时写入一个excel不同的sheet
writer=pd.ExcelWriter('output.xlsx')
VA.to_excel(writer, sheet_name = 'VA')
OH.to_excel(writer, sheet_name = 'OH')
writer.save()

# 同时筛选
BLAND = df.loc[(df['COUNTY'] == 'BLAND') & (df['State'] == 'VA')]

# 转成numpy快速开车
array = VA.values

numpy广播机制

在numpy广播机制的作用下,应该避免去写for循环的程序,显得不够pythonic而且浪费时间和计算力。

可以发现,在对矩阵和一个元素求和时,numpy会对一个元素进行复制填充,使得一个元素的维度和矩阵维度相同,下面的例子中a+10中的10被填充为[[10,10,10]]

1
2
3
4
5
6
7
8
9
a = np.array([[1,2,3]])
print(a)
>>>
[[1 2 3]]
print(a+10)
>>>
[[11 12 13]]
print(a.shape)
>>>(1,3)

同时也要避免矩阵维度不严格带来的BUG:

1
2
3
4
a = np.array([1, 2, 3]) #不推荐
b = np.array([[1, 2, 3]])
print(a.shape, b.shape)
>>>(3,) (1, 3)

广播机制的推广:

矩阵每一个元素除以对应列元素的和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
test = np.random.randint(0, 100, size=(4,4))
>>>
[[91 25 41 37]
[82 72 86 25]
[29 38 31 22]
[74 88 54 44]]

test = test / test.sum(axis=0)
>>>

[[0.32971014 0.11210762 0.19339623 0.2890625 ]
[0.29710145 0.32286996 0.40566038 0.1953125 ]
[0.10507246 0.17040359 0.14622642 0.171875 ]
[0.26811594 0.39461883 0.25471698 0.34375 ]]

广播机制对数据归一化

属性缩放到一个指定的最大和最小值(通常是1-0)之间,常用的最小最大规范化方法:
\begin{equation}
(x-min(x))/(max(x)-min(x))
\end{equation}

1
2
3
4
5
6
7
8
9
10
11
12
test = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(test)
>>>
[[1 2 3]
[4 5 6]
[7 8 9]]
test_nor = (test - test.min(axis=0))/ (test.max(axis=0) - test.min(axis=0))
print(test_nor)
>>>
[[0. 0. 0. ]
[0.5 0.5 0.5]
[1. 1. 1. ]]

numpy数组复制并填充

实现功能:

将一个$n\times n$的矩阵复制3次,使维度变为$n \times n \times 3$。推广:将$x$个$n\times n$的矩阵复制3次,即维度为$x \times n \times n$的矩阵变为$x \times n \times n \times 3$的矩阵。

背景:将单通道的gray图像填充为RGB图像,R,G,B的取值为原始的gray颜色值,共对$x$个图像进行这样的处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

def gray2rgb(array):
number = array.shape[0]
height = array.shape[1]
width = array.shape[2]

array = np.repeat(array, 3)

array = array.reshape(number, height, width, 3)
return array

x_train = gray2rgb(x_train)

numpy实现存取csv文件

读入:

1
array = numpy.loadtxt(open("1.csv","rb"),delimiter=",",skiprows=0)

写出:

1
numpy.savetxt('2.csv', array, delimiter = ',')

多次写入csv文件不产生空行

重点是加入newline=''

1
2
3
with open("filename.csv", "a+", newline='') as csvfile: 
writer = csv.writer(csvfile)
writer.writerow(array, delimiter=',' )

感谢上学期间打赏我的朋友们。赛博乞讨:我,秦始皇,打钱。

欢迎订阅我的文章