粉丝需求说明
今天一大早,就有一位粉丝,让我处理一个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()
函数,就可以将数据添加到表格中。index=None
参数。为了更加清晰的展现这个效果,下面提取其中一条数据为大家讲解此过程。
x = df["列一"][0]
x
结果如下:
y = x[10:-3].split(",")
y
结果如下:
注意到上述结果中,存在一些空格,我们后续需要使用strip()
函数去除掉。
z = [[1] + i.strip().split(" ") for i in y]
z
结果如下:
df1 = pd.DataFrame()
df1.append(z)
结果如下:
在请教了明佬以后,最终给出如下代码,仅需要十几秒,就可以处理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())
结果如下:
import numpy as np
a = 2
b = np.nan
isinstance (a,int)
isinstance (a,str)
isinstance (b,int)
isinstance (a,str)
结果如下:
好了,以上便是今天的全部内容了,如果你喜欢今天的内容,希望你能在下方点个赞和在看支持我,谢谢!
本文分享自 Python与Excel之交 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!