Pandas處理8w條數(shù)據(jù),最終生成800w條!
點擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注
回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書
今
日
雞
湯
野云萬里無城郭,雨雪紛紛連大漠。粉絲需求說明
今天一大早,就有一位粉絲,讓我處理一個Padas問題,詳情請看下圖:

哎,他這個敘述確實有點難懂,我來翻譯一下。
需求:有一個csv文件,里面有一些經(jīng)緯度數(shù)據(jù)。其中每一行有若干組經(jīng)緯度數(shù)據(jù),都是用逗號隔開。我們需要做的就是,將每一個經(jīng)緯度數(shù)據(jù)提取出來,分別存儲到Excel的兩列中,同時多添加一列,表示行號,總共就是3列。
原始數(shù)據(jù)截圖:

我處理后截圖:

我的測試
直接先上完整代碼吧!
import?pandas?as?pd
#?1.?讀取數(shù)據(jù)
df?=?pd.read_csv("wgs84?-?副本.csv",header=None)
df.columns?=?["列一","列二"]
##?2.?數(shù)據(jù)處理與數(shù)據(jù)寫入
df1?=?pd.DataFrame()
for?index,value?in?enumerate(df["列一"]):
????y?=?value[10:-3].split(",")
????z?=?[[index+1]?+?i.strip().split("?")?for?i?in?y]
????df1?=?df1.append(z)
df1.columns?=?["行號","經(jīng)度","維度"]
##?3.?保存數(shù)據(jù)
df1.to_excel("經(jīng)緯度.xlsx",index=None)
上述代碼共分為3個部分,詳細(xì)解釋如下:
- 首先是數(shù)據(jù)讀取。由于給我的數(shù)據(jù)沒有標(biāo)題行,讀取時候需要使用
header=None參數(shù),同時為了后續(xù)處理方便,為數(shù)據(jù)添加標(biāo)題行。 - 接著是數(shù)據(jù)處理和數(shù)據(jù)寫入。由于每一行數(shù)據(jù)都在
(( ))雙括號中,我們需要先提取其中的字符串,然后按照,逗號切分,再按照空格切分,得到每個經(jīng)緯度數(shù)據(jù)的列表。同時使用+加號拼接列表,就得到了每行數(shù)據(jù),都是3個數(shù)據(jù)組成的列表嵌套。再使用append()函數(shù),就可以將數(shù)據(jù)添加到表格中。 - 最后是數(shù)據(jù)寫入。我們將組織好的數(shù)據(jù),最終寫入到Excel文件中,不要索引行,因此使用了
index=None參數(shù)。
為了更加清晰的展現(xiàn)這個效果,下面提取其中一條數(shù)據(jù)為大家講解此過程。
① 取出其中一條數(shù)據(jù)
x?=?df["列一"][0]
x
結(jié)果如下:

② 切片+切分字符串
y?=?x[10:-3].split(",")
y
結(jié)果如下:

注意到上述結(jié)果中,存在一些空格,我們后續(xù)需要使用strip()函數(shù)去除掉。
③ 列表拼接+列表解析式
z?=?[[1]?+?i.strip().split("?")?for?i?in?y]
z
結(jié)果如下:

④ 使用append函數(shù)添加數(shù)據(jù)
df1?=?pd.DataFrame()
df1.append(z)
結(jié)果如下:

如果有8w+數(shù)據(jù),怎么處理的快呢?
在請教了明佬以后,最終給出如下代碼,僅需要十幾秒,就可以處理8w+條數(shù)據(jù)。import?pandas?as?pd8w+的數(shù)據(jù),最終生成后,卻有800w條,Excel是打不開的。
import?os
# 分塊、分塊、分塊
chunks?=?pd.read_csv("wgs84.csv",?chunksize=10000)
last?=?0
for?df?in?chunks:
????df.dropna(how="all",?inplace=True)
????result?=?[]
????for?a,?b?in?df.values:
????????if?not?isinstance(a,?str):
????????????continue
????????if?pd.isna(b):
????????????b?=?last+1
????????elif?isinstance(b,?str)?and?not?b.isdigit():
????????????print(a,?b,?last)
????????????continue
????????for?p?in?a[10:-3].split(","):
????????????result.append((b,?*p.split()))
????????if?not?pd.isna(b):
????????????last?=?int(b)
????df?=?pd.DataFrame(result,?columns=["行號",?"經(jīng)度",?"維度"])
????file?=?"result.csv"
????df.to_csv(file,?index=False,?mode='a',
??????????????header=not?os.path.exists(file),?encoding="u8")

為了大家能夠更快的理解這段代碼,有幾個知識點,我給大家講解一下。
① 列表前面加個*號,啥意思?
列表、元組前面加星號,作用是將列表解開成兩個獨立的參數(shù),傳入函數(shù),字典前面加兩個星號,是將字典解開成獨立的元素作為形參。x?=?"Polygon?((100.41370674?38.56406437,?100.41363237?38.56400317))"結(jié)果如下:
#?不加*號
for?i,p?in?enumerate(x[10:-3].split(",")):
????print(p.split())
#?加*號
for?i,p?in?enumerate(x[10:-3].split(",")):
????print(*p.split())

② isinstance()函數(shù),啥意思?
import?numpy?as?np結(jié)果如下:
a?=?2
b?=?np.nan
isinstance?(a,int)
isinstance?(a,str)
isinstance?(b,int)
isinstance?(a,str)

如果是你,你會怎么做呢?
-------------------?End?-------------------
往期精彩文章推薦:
Python項目實戰(zhàn)篇——常用驗證碼標(biāo)注&識別(CNN神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練/測試/部署)
Python項目實戰(zhàn)篇——常用驗證碼標(biāo)注&識別(前端+后端實現(xiàn)高效率數(shù)據(jù)標(biāo)注)
Python項目實戰(zhàn)篇——常用驗證碼標(biāo)注&識別(數(shù)據(jù)采集/預(yù)處理/字符圖切割)

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩句吧~
