点击上方“Python爬虫与数据挖掘”,进行关注
回复“书籍”即可获赠Python从入门到进阶共10本电子书
今
日
鸡
汤
野云万里无城郭,雨雪纷纷连大漠。
粉丝需求说明
今天一大早,就有一位粉丝,让我处理一个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个部分,详细解释如下:
首先是数据读取。由于给我的数据没有标题行,读取时候需要使用
header=None
参数,同时为了后续处理方便,为数据添加标题行。接着是数据处理和数据写入。由于每一行数据都在
(( ))
双括号中,我们需要先提取其中的字符串,然后按照,逗号切分,再按照空格切分,得到每个经纬度数据的列表。同时使用+加号拼接列表,就得到了每行数据,都是3个数据组成的列表嵌套。再使用append()
函数,就可以将数据添加到表格中。最后是数据写入。我们将组织好的数据,最终写入到Excel文件中,不要索引行,因此使用了
index=None
参数。
为了更加清晰的展现这个效果,下面提取其中一条数据为大家讲解此过程。
① 取出其中一条数据
x = df["列一"][0]
x
结果如下:
② 切片+切分字符串
y = x[10:-3].split(",")
y
结果如下:
注意到上述结果中,存在一些空格,我们后续需要使用strip()
函数去除掉。
③ 列表拼接+列表解析式
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 = 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=["行号", "经度", "维度"])
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)
结果如下:
好了,本次答疑就到这里,你学会了吗?
如果是你,你会怎么做呢?
------------------- End -------------------
往期精彩文章推荐:
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行
/今日留言主题/
随便说一两句吧~