Pandas处理8w条数据,最终生成800w条!

这篇博客介绍了如何使用Python的Pandas库处理包含经纬度数据的CSV文件,将经纬度提取并存储到Excel的两列中,同时添加行号。通过一个具体的例子,展示了数据处理的详细步骤,包括数据读取、处理、写入,并给出了处理大量数据的优化方案。此外,还解释了`isinstance()`函数的作用以及列表前加星号的用法。
摘要由CSDN通过智能技术生成

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

野云万里无城郭,雨雪纷纷连大漠。

粉丝需求说明

今天一大早,就有一位粉丝,让我处理一个Padas问题,详情请看下图:

ade9f3fef69f9dfea516b040aaa093e2.png

哎,他这个叙述确实有点难懂,我来翻译一下。

需求:有一个csv文件,里面有一些经纬度数据。其中每一行有若干组经纬度数据,都是用逗号隔开。我们需要做的就是,将每一个经纬度数据提取出来,分别存储到Excel的两列中,同时多添加一列,表示行号,总共就是3列。

原始数据截图:

6f5ac03e49590a93df4844261d7aa7bc.png

我处理后截图:

b96e52743fe60305f75167308bcad88c.png

我的测试

直接先上完整代码吧!

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

结果如下:

e8fef4c2e27b82e54f4d663a1800565a.png

② 切片+切分字符串
y = x[10:-3].split(",")
y

结果如下:

dfd70c06feded2feb4ba2f26adc2b4da.png

注意到上述结果中,存在一些空格,我们后续需要使用strip()函数去除掉。

③ 列表拼接+列表解析式
z = [[1] + i.strip().split(" ") for i in y]
z

结果如下:

ac495b0947751d8510a14ff08c3caed0.png

④ 使用append函数添加数据
df1 = pd.DataFrame()
df1.append(z)

结果如下:

9b52a82e607b4737978599dfa00cc5de.png

如果有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是打不开的。

e9a7604ebe392ad0ff87922979b00237.png

为了大家能够更快的理解这段代码,有几个知识点,我给大家讲解一下。

① 列表前面加个*号,啥意思?

列表、元组前面加星号,作用是将列表解开成两个独立的参数,传入函数,字典前面加两个星号,是将字典解开成独立的元素作为形参。

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())

结果如下:

73a78ab3ef9b15e30d4b5730e68db261.png

② isinstance()函数,啥意思?
import numpy as np

a = 2
b = np.nan

isinstance (a,int)
isinstance (a,str)
isinstance (b,int)
isinstance (a,str)

结果如下:

708f8830f4d8aff4b0ff6ce2a76c9693.png

好了,本次答疑就到这里,你学会了吗?

如果是你,你会怎么做呢?

------------------- End -------------------

往期精彩文章推荐:

89bd4e4aa452d6470422898a1f52cf2b.png

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值