愛伊米

Pandas處理8w條資料,最終生成800w條!

粉絲需求說明

今天一大早,就有一位粉絲,讓我處理一個Padas問題,詳情請看下圖:

Pandas處理8w條資料,最終生成800w條!

哎,他這個敘述確實有點難懂,我來翻譯一下。

需求:

有一個csv檔案,裡面有一些經緯度資料。其中每一行有若干組經緯度資料,都是用逗號隔開。我們需要做的就是,將每一個經緯度資料提取出來,分別儲存到Excel的兩列中,同時多新增一列,表示行號,總共就是3列。

原始資料截圖:

我處理後截圖:

Pandas處理8w條資料,最終生成800w條!

我的測試

直接先上完整程式碼吧!

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

結果如下:

Pandas處理8w條資料,最終生成800w條!

注意到上述結果中,存在一些空格,我們後續需要使用函式去除掉。

③ 列表拼接+列表解析式

z = [[1] + i。strip()。split(“ ”) for i in y]

z

結果如下:

④ 使用append函式新增資料

df1 = pd。DataFrame()

df1。append(z)

結果如下:

Pandas處理8w條資料,最終生成800w條!

如果有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())

結果如下:

Pandas處理8w條資料,最終生成800w條!

② isinstance()函式,啥意思?

import numpy as np

a = 2

b = np。nan

isinstance (a,int)

isinstance (a,str)

isinstance (b,int)

isinstance (a,str)

結果如下:

Pandas處理8w條資料,最終生成800w條!

好了,本次答疑就到這裡,你學會了嗎?

如果是你,你會怎麼做呢?