粉絲需求說明
今天一大早,就有一位粉絲,讓我處理一個Padas問題,詳情請看下圖:
哎,他這個敘述確實有點難懂,我來翻譯一下。
需求:
有一個csv檔案,裡面有一些經緯度資料。其中每一行有若干組經緯度資料,都是用逗號隔開。我們需要做的就是,將每一個經緯度資料提取出來,分別儲存到Excel的兩列中,同時多新增一列,表示行號,總共就是3列。
原始資料截圖:
我處理後截圖:
我的測試
直接先上完整程式碼吧!
import pandas as pd
# 1。 讀取資料
df = pd。read_csv(“wgs84 - 副本。csv”,header=None)
df。columns = [“列一”,“列二”]
## 2。 資料處理與資料寫入
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 = [“行號”,“經度”,“維度”]
## 3。 儲存資料
df1。to_excel(“經緯度。xlsx”,index=None)
上述程式碼共分為3個部分,詳細解釋如下:
首先是資料讀取。
由於給我的資料沒有標題行,讀取時候需要使用引數,同時為了後續處理方便,為資料新增標題行。
接著是資料處理和資料寫入。
由於每一行資料都在雙括號中,我們需要先提取其中的字串,然後按照,逗號切分,再按照空格切分,得到每個經緯度資料的列表。同時使用+加號拼接列表,就得到了每行資料,都是3個數據組成的列表巢狀。再使用函式,就可以將資料新增到表格中。
最後是資料寫入。
我們將組織好的資料,最終寫入到Excel檔案中,不要索引行,因此使用了引數。
為了更加清晰的展現這個效果,下面提取其中一條資料為大家講解此過程。
① 取出其中一條資料
x = df[“列一”][]
x
結果如下:
② 切片+切分字串
y = x[10:-3]。split(“,”)
y
結果如下:
注意到上述結果中,存在一些空格,我們後續需要使用函式去除掉。
③ 列表拼接+列表解析式
z = [[1] + i。strip()。split(“ ”) for i in y]
z
結果如下:
④ 使用append函式新增資料
df1 = pd。DataFrame()
df1。append(z)
結果如下:
如果有8w+資料,怎麼處理的快呢?
在請教了明佬以後,最終給出如下程式碼,僅需要十幾秒,就可以處理8w+條資料。
import pandas as pd
import os
# 分塊、分塊、分塊
chunks = pd。read_csv(“wgs84。csv”, chunksize=10000)
last =
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=[“行號”, “經度”, “維度”])
file = “result。csv”
df。to_csv(file, index=False, mode=‘a’,
header=not os。path。exists(file), encoding=“u8”)
8w+的資料,最終生成後,卻有800w條,Excel是打不開的。
為了大家能夠更快的理解這段程式碼,有幾個知識點,我給大家講解一下。
① 列表前面加個*號,啥意思?
列表、元組前面加星號,作用是將列表解開成兩個獨立的引數,傳入函式,字典前面加兩個星號,是將字典解開成獨立的元素作為形參。
x = “Polygon ((100。41370674 38。56406437, 100。41363237 38。56400317))”
# 不加*號
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()函式,啥意思?
import numpy as np
a = 2
b = np。nan
isinstance (a,int)
isinstance (a,str)
isinstance (b,int)
isinstance (a,str)
結果如下:
好了,本次答疑就到這裡,你學會了嗎?
如果是你,你會怎麼做呢?