自由的羽毛 发表于 2023-8-3 09:59:24

【pandas小技巧】--拆分列

拆分列是pandas中常用的一种数据操作,它可以将一个包含多个值的列按照指定的规则拆分成多个新列,方便进行后续的分析和处理。
拆分列的使用场景比较广泛,以下是一些常见的应用场景:

[*]处理日期数据:在日期数据中,经常会将年、月、日等信息合并成一列,通过拆分列可以将其拆分成多个新列,方便进行时间序列分析。
[*]处理地址数据:类似于日期数据,在地址数据中也经常会将省、市、区等信息合并成一列,通过拆分列可以将其拆分成多个新列,有利于进行地理位置分析。
[*]处理姓名数据:在一些数据集中,姓名通常会以“姓”、“名”两列呈现,通过拆分列可以将其分别提取出来,方便进行人口统计学分析。
[*]处理文本数据:在一些文本数据中,可能存在多个关键词同时出现的情况,通过拆分列可以将这些关键词拆分成多个新列,方便进行文本分类或聚类分析。
本篇简要介绍下pandas拆分列的常用方法。
1. 拆出列中部分信息

如下测试数据:
import pandas as pd

df = pd.DataFrame(
    {
      "姓名": ["张 三", "李 四", "王 五"],
      "地址": [
            "江苏省,南京市,建邺区",
            "浙江省,杭州市,余杭区",
            "安徽省,合肥市,庐阳区",
      ],
    }
)

dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683872504454-0feafd1d-f991-4252-a599-68bf5c20b605.png#averageHue=%23e0e0e0&clientId=u63a61f82-9248-4&from=paste&height=127&id=u30ba74b1&originHeight=127&originWidth=261&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8949&status=done&style=none&taskId=ub00bf293-e0ab-4b86-9559-4676debdf0d&title=&width=261
提取姓和城市信息:
df["城市"] = df["地址"].str.split(",",
                           expand=True)
df["姓"] = df["姓名"].str.split(" ",
                           expand=True)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683872565816-4462a632-5bd0-46b1-ad56-45e31072c57c.png#averageHue=%23e0dad9&clientId=u63a61f82-9248-4&from=paste&height=128&id=uef7b41fa&originHeight=128&originWidth=356&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11538&status=done&style=none&taskId=u5bdfdc6a-71ea-4fc2-957b-ff556c21754&title=&width=356
注意要加上 expand=True 参数。
因为:

[*]expand=False:split后的值是Series
[*]expand=True:split后的值是DataFrame
2. 拆分成多列

拆分成多列有两种方式:
第一种:
df[["省", "市", "区"]] =
        df["地址"].str.split(",", expand=True)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683873792744-5bfca2dd-e4f0-4247-a885-13ce65dfcb1e.png#averageHue=%23e1dada&clientId=u63a61f82-9248-4&from=paste&height=141&id=ud012d651&originHeight=141&originWidth=452&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12075&status=done&style=none&taskId=u669090ce-ed0c-44ee-8296-78579a7262c&title=&width=452
第二种:这种方式不需要设置 expand=True
df["省"], df["市"], df["区"] =
        zip(*df["地址"].str.split(","))
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683873792744-5bfca2dd-e4f0-4247-a885-13ce65dfcb1e.png#averageHue=%23e1dada&clientId=u63a61f82-9248-4&from=paste&height=141&id=JikVJ&originHeight=141&originWidth=452&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12075&status=done&style=none&taskId=u669090ce-ed0c-44ee-8296-78579a7262c&title=&width=452
3. 使用正则拆分

除了直接按照字符来split列中的数据,也可以用正则表达式来split。
比如如下的场景,需要对客户的手机号进行保密,可以通过正则表达式来截断手机号,只保留最后四位。
df = pd.DataFrame(
    {
      "单号": ["0001", "0002", "0003"],
      "手机号": [
            "13900000001",
            "18922233344",
            "15955566677",
      ],
    }
)


df["截断手机号"] = df["手机号"].str.split(
    r"\d{7}",
    expand=True,
    regex=True,
)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683874205738-a95cd09d-225a-4d19-a9bd-12d7c4c2126f.png#averageHue=%23e5dddc&clientId=u63a61f82-9248-4&from=paste&height=136&id=uab7f3b74&originHeight=136&originWidth=300&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7912&status=done&style=none&taskId=u0425c9d4-19a8-4d0e-99d8-bf2669d095e&title=&width=300
通过正则表达式,可以更加灵活的拆分列的数据。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【pandas小技巧】--拆分列