亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析python常用數(shù)據(jù)文件處理方法

 更新時(shí)間:2021年10月21日 10:10:37   作者:Fourier_1024  
這篇文章主要介紹了python常用數(shù)據(jù)文件處理方法,雖說(shuō)python運(yùn)行速度慢,但其編程速度,第三方包的豐富度是真的高,涉及到文件批處理還是會(huì)選擇python,感興趣的朋友跟隨小編一起看看吧

0.前言

雖說(shuō)python運(yùn)行速度慢,但其編程速度,第三方包的豐富度是真的高。
涉及到文件批處理還是會(huì)選擇python。

1. 動(dòng)態(tài)文件名

在文件批處理中,文件名經(jīng)常只有編號(hào)是不同的,可以通過(guò)給字符串傳遞不同的編號(hào)來(lái)獲取動(dòng)態(tài)文件名。

file_num = 324
# file_num = 1
for i in range(file_num):
	file_name = "正常數(shù)據(jù)\\{}.正常.txt".format(i + 1)
	...

2. 將文件轉(zhuǎn)換為csv格式

一般數(shù)據(jù)提供者為了節(jié)省存儲(chǔ)空間,都會(huì)通過(guò)規(guī)定的格式存儲(chǔ)到txt文件中,這種格式對(duì)計(jì)算機(jī)可能并不友好。而逗號(hào)文件csv格式可以輕松被numpy、pandas等數(shù)據(jù)處理包讀取。
首先通過(guò)逐行讀取獲取每行數(shù)據(jù)(大部分?jǐn)?shù)據(jù)文件都是每行格式相同,如果數(shù)據(jù)只有一行,可以全部讀取或者逐字符讀?。?,之后通過(guò)line.replace('\n', ‘')將每行的換行符刪除,以免最后得到的csv文件有空行。
使用line.split(':')將字符串分解為多個(gè)字段。
通過(guò)csv.writer寫入整行。

import csv
outFile = open(file_path + outFile_name, 'w', encoding='utf-8', newline='' "")
csv_writer = csv.writer(outFile)
with open(file_path + file_name, "r") as f:
    index = 0
    for line in f:
        # 寫入表頭
        if index == 0:
            csv_writer.writerow(['T', 'TimeStamp', 'RangeReport', 'TagID', 'AnchorID',
                                 'ranging', 'check', 'SerialNumber', 'DataID'])
            index = index + 1
            continue
        line = line.replace('\n', '')
        str = line.split(':')
        csv_writer.writerow(str)

3. 初步處理csv文件

一開始得到的csv文件往往是我們不想要的,需要進(jìn)行簡(jiǎn)單的處理。
例如我想將四行數(shù)據(jù)合并為一行。
使用pandas讀取csv文件為一個(gè)表df。將希望生成的格式簡(jiǎn)單做一個(gè)有標(biāo)題、有一行數(shù)據(jù)的文件,讀取為另一個(gè)表df2.
可以使用

del df['T']

來(lái)刪除指定的列。

可以通過(guò)

df2.loc[row] = list

來(lái)確定新文件的一行數(shù)據(jù)。pandas訪問(wèn)行數(shù)據(jù)

import pandas as pd

df = pd.read_csv(file_path + file_name)
# 刪除某些列
del df['T']
del df['RangeReport']
del df['TagID']

# 判斷同一DataID對(duì)應(yīng)的SerialNumber是否相同
# SerialNumberBegin = df['SerialNumber'][0]
# DataIDBegin = df['DataID'][0]
# for row in range(df.shape[0]):
#     c = df['SerialNumber'][row] != (SerialNumberBegin + int(row / 4)) % 256
#     d = df['DataID'][row] != DataIDBegin + int(row / 4)
#     e = df['AnchorID'][row] != row % 4
#     if c | d | e:
#         print('err')
del df['AnchorID']

# print(type(df['TimeStamp'][0]))
# 進(jìn)行表合并
df2 = pd.read_csv(file_path + "合并格式.csv")
for row in range(int(df.shape[0]/4)):
    list = [3304,229,90531088,90531088,90531088,90531088,760,760,760,760,760,760,760,760]
    # DataID,SerialNumber,TimeStamp0,TimeStamp1,TimeStamp2,TimeStamp3,ranging0,check0,ranging1,check1,ranging2,check2,ranging3,check3
    list[0] = df['DataID'][row*4]
    list[1] = df['SerialNumber'][row*4]
    list[2] = df['TimeStamp'][row*4+0]
    list[3] = df['TimeStamp'][row*4+1]
    list[4] = df['TimeStamp'][row*4+2]
    list[5] = df['TimeStamp'][row*4+3]
    list[6]  = df['ranging'][row*4+0]
    list[7]  = df['check'][row*4+0]
    list[8]  = df['ranging'][row*4+1]
    list[9]  = df['check'][row*4+1]
    list[10] = df['ranging'][row*4+2]
    list[11] = df['check'][row*4+2]
    list[12] = df['ranging'][row*4+3]
    list[13] = df['check'][row*4+3]

    df2.loc[row] = list
df2.to_csv(file_path+contact_name)

4. 獲取部分?jǐn)?shù)據(jù)

可以通過(guò)

df0 = df.iloc[:, 3:7]

或者

df0 = df[["check0","check1","check2","check3"]]

來(lái)獲取一個(gè)表的某幾列。

5. 數(shù)據(jù)間的格式轉(zhuǎn)換

一般會(huì)在list、numpy、pandas三種格式間進(jìn)行數(shù)據(jù)轉(zhuǎn)換。
自己創(chuàng)建數(shù)據(jù)時(shí),經(jīng)常使用

y_show = []
y_show.append(n_clusters_)

維度調(diào)整好后,可以是一維或者多維,再轉(zhuǎn)換為numpy或者pandas。
其中轉(zhuǎn)換成numpy的方法如下

y = np.array(y_show)

6. 離群點(diǎn)、重合點(diǎn)的處理

使用DBSCAN算法進(jìn)行聚類。具體算法描述隨便搜就有。
有兩個(gè)重要參數(shù),一個(gè)是聚類半徑,另一個(gè)是最小鄰居數(shù)。
指定較大半徑以及較大鄰居數(shù)可以篩選出離散點(diǎn)。
指定較小半徑可以篩選出重合點(diǎn)、相似點(diǎn)。
代碼如下,使用一個(gè)n*m的numpy矩陣作為輸入,對(duì)m維的點(diǎn)進(jìn)行聚類。
通過(guò)一通操作獲取labels,是一個(gè)map,key值為int數(shù)值,-1,0,1,2…。-1代表離群點(diǎn),其他代表第幾簇。value是一個(gè)list,代表各簇的點(diǎn)的下標(biāo)。

from sklearn.cluster import DBSCAN

y = df[["d0","d1","d2","d3"]].to_numpy()

db = DBSCAN(eps=3, min_samples=2).fit(y)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_

# 統(tǒng)計(jì)簇中l(wèi)abels的數(shù)量
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

7. 數(shù)據(jù)繪制

繪制二維的比較簡(jiǎn)單,這里只貼上三維繪制代碼

import matplotlib.pyplot as plt
import pandas as pd

from mpl_toolkits.mplot3d import axes3d

df = pd.read_csv(file_path+file_name)
x1 = df["x"].to_numpy()
y1 = df["y"].to_numpy()
z1 = df["z"].to_numpy()

df = pd.read_csv(file_path+file_name2)
x2 = df["x"].to_numpy()
y2 = df["y"].to_numpy()
z2 = df["z"].to_numpy()

# new a figure and set it into 3d
fig = plt.figure()
ax = fig.gca(projection='3d')

# set figure information
# ax.set_title("3D")
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

# draw the figure, the color is r = read
# figure1 = ax.plot(x1, y1, z1, c='b')
figure2 = ax.plot(x2, y2, z2, c='r')
# figure3 = ax.plot(x3, x3, z3, c='g')
# figure4 = ax.plot(x4, x4, z4, c='y')

ax.set_xlim(0, 7000)
# ax.set_ylim(0, 5000)
ax.set_zlim(0, 3000)

plt.show()

8. numpy的矩陣運(yùn)算

# 轉(zhuǎn)換數(shù)據(jù)類型
Zk = Zk.astype(float)
# 范數(shù) a,b是維度相同的向量
np.linalg.norm(a-b) 
# 矩陣乘法
np.matmul(A, B)
# 矩陣求逆
np.linalg.inv(A)
# 單位陣
np.eye(dims)
# 轉(zhuǎn)置
Zk = Zk.T

9. 保存文件

可以使用csv writerow存文件,見(jiàn)1.
也可以使用numpy或者pandas保存文件。
如果直接使用pandas的

df2.to_csv(file_path+contact_name)

保存文件,會(huì)額外保存一行index。可以通過(guò)參數(shù),index=False來(lái)控制。
如果還有其他要求可以查閱pd.to_csv

也可使用numpy,將一個(gè)numpy類型數(shù)據(jù)通過(guò)指定格式存文件。這里一般要指定格式,否則有可能會(huì)存成自己不希望的類型。

np.savetxt(file_path + "異常數(shù)據(jù).txt", np.array(y_show,dtype=np.int16), fmt="%d")

到此這篇關(guān)于python常用數(shù)據(jù)文件處理方法的文章就介紹到這了,更多相關(guān)python數(shù)據(jù)文件處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中用于返回絕對(duì)值的abs()方法

    Python中用于返回絕對(duì)值的abs()方法

    這篇文章主要介紹了Python中用于返回絕對(duì)值的abs()方法,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python實(shí)例練習(xí)水仙花數(shù)問(wèn)題講解

    Python實(shí)例練習(xí)水仙花數(shù)問(wèn)題講解

    這篇文章介紹了Python找水仙花數(shù)從分析到實(shí)現(xiàn)的過(guò)程,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • python中的函數(shù)遞歸和迭代原理解析

    python中的函數(shù)遞歸和迭代原理解析

    這篇文章主要介紹了python中的函數(shù)遞歸和迭代原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python?jiaba庫(kù)的使用詳解

    Python?jiaba庫(kù)的使用詳解

    這篇文章主要為大家介紹了Python jiaba庫(kù)的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Pandas中如何對(duì)DataFrame列名進(jìn)行重命名

    Pandas中如何對(duì)DataFrame列名進(jìn)行重命名

    在做數(shù)據(jù)挖掘的時(shí)候,想改一個(gè)DataFrame的column名稱,所以就查了一下,下面這篇文章主要給大家介紹了關(guān)于Pandas中如何對(duì)DataFrame列名進(jìn)行重命名的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Python中itertools的用法詳解

    Python中itertools的用法詳解

    循環(huán)器(iterator)是對(duì)象的容器,包含有多個(gè)對(duì)象。這篇文章主要介紹了python itertools用法,需要的朋友可以參考下
    2020-02-02
  • python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法

    python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)

    Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù),主要通過(guò)三個(gè)問(wèn)題如何創(chuàng)建SQLite數(shù)據(jù)庫(kù)?如何向SQLite表中插入數(shù)據(jù)?如何查詢SQLite表中的數(shù)據(jù)?展開文章主題詳情,需要的朋友可以參考一下
    2022-06-06
  • python運(yùn)行腳本文件的三種方法實(shí)例

    python運(yùn)行腳本文件的三種方法實(shí)例

    在計(jì)算中,腳本一詞用于指代包含訂單邏輯序列的文件或批處理文件,下面這篇文章主要給大家介紹了關(guān)于python運(yùn)行腳本文件的三種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Python基于回溯法解決01背包問(wèn)題實(shí)例

    Python基于回溯法解決01背包問(wèn)題實(shí)例

    這篇文章主要介紹了Python基于回溯法解決01背包問(wèn)題,結(jié)合實(shí)例形式分析了Python回溯法采用深度優(yōu)先策略搜索解決01背包問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12

最新評(píng)論