前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再见Excel!Pandas分分钟钟处理8w条数据!

再见Excel!Pandas分分钟钟处理8w条数据!

作者头像
Python与Excel之交
发布2021-09-03 15:05:56
8390
发布2021-09-03 15:05:56
举报
文章被收录于专栏:Python与Excel之交Python与Excel之交

粉丝需求说明

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

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

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

原始数据截图:

我处理后截图:

我的测试

直接先上完整代码吧!

代码语言:javascript
复制
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参数。

为了更加清晰的展现这个效果,下面提取其中一条数据为大家讲解此过程。

① 取出其中一条数据
代码语言:javascript
复制
x = df["列一"][0]
x

结果如下:

② 切片+切分字符串
代码语言:javascript
复制
y = x[10:-3].split(",")
y

结果如下:

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

③ 列表拼接+列表解析式
代码语言:javascript
复制
z = [[1] + i.strip().split(" ") for i in y]
z

结果如下:

④ 使用append函数添加数据
代码语言:javascript
复制
df1 = pd.DataFrame()
df1.append(z)

结果如下:

如果有8w+数据,怎么处理的快呢?

在请教了明佬以后,最终给出如下代码,仅需要十几秒,就可以处理8w+条数据。

代码语言:javascript
复制
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是打不开的。

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

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

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

代码语言:javascript
复制
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()函数,啥意思?
代码语言:javascript
复制
import numpy as np

a = 2
b = np.nan

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

结果如下:

好了,以上便是今天的全部内容了,如果你喜欢今天的内容,希望你能在下方点个赞和在看支持我,谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与Excel之交 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我的测试
  • 如果有8w+数据,怎么处理的快呢?
    • ① 列表前面加个*号,啥意思?
      • ② isinstance()函数,啥意思?
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档