hive 多行合并一行_Python_一行多行合并拆分

  是这样的,这个需求应该还是会常有的,特别是当你收集到的数据不规范的时候。有些人自认为自己很聪明,给的数据很漂亮,看上去一目了然,它不知道这些数据还要用来分析出来的,当要用的时候,很难受,正如下面这样的数据,一个人对应几个省,个数还不一样。看上去是不是既优雅又美观,但是你要怎么操作呢,我要每个省的数据,每个省然后对应哪些人。这个时候你不会操作怎么办?是不是很难受,下面有几个思路可以借鉴一下,用Python完成的,其实Excel也能,但用Excel来处理就偏题了。

  再仔细看一下,这个字体是不是很有趣呢,不那么严肃,透露着活泼的气氛,这是上周在毕老师苹果电脑上发现的,于是问了一下字体的名字,没想到windows也是有的,只是要网上折腾一下,下面那个链接是我自己的存储空间,很安全,复制到浏览器或者下载器就可以下载了。

a10b9a8d1b0250c8b3b51ab888ceb8c4.png

https://linss.oss-cn-beijing.aliyuncs.com/%E7%B4%A0%E6%9D%90/fonts/%E9%9B%85%E7%97%9E-%E7%AE%80.ttf

【进入正题】

先读取数据

import pandas as pdimport osos.chdir(r"E:\Python\小工具")data = pd.read_excel("一行拆分合并.xlsx")

【方案一】

  这个就有点绕了,但是学习嘛,不影响,这个过程可以学到新的东西,其他地方是用的上的。也可以顺便复习一下pandas的一些操作,学而时习之嘛。我就拆分一下哦。

# 将一列分成多列。这里有点偷懒了,一个人最多4各省嘛,我就写了abcd,这是不严谨的,不过危急时刻时间最重要,先解决问题再说。

data[["a","b","c","d"]] = data["province"].str.split("、",expand=True)

a9a29d7e1313d067488b470751fc4cc2.png

#选取想要的列

data_final = data[["id",'name',"a","b","c","d"]]

66d5c9fcc974cc6533fd1780182c1016.png

#将行转列

  前面两步还是很轻松愉悦的,这一步是重点,涉及一个新的,也不算,之前pandas系列里面说过,(这是传送门)。不过刚回头看了一下,说的略微简单,怕你理解不到,所以这一篇后面又专门深入的介绍了一下,在后面,往后面看,如果这都还看不懂,那就很遗憾了。

data_final = data_final.melt(id_vars=["id","name"],value_name="类型")

b8f26dfc6e46f0ba910fbb3c83a20a46.png

  是不是快到想要的效果了,后面在把不要的列,空值处理一下就行了,很简单了,看看就能懂的。

#排序data_final = data_final[['id','name','类型']]data_final.sort_values(by="id",inplace=True)# 删除“类型==None”的行data_final = data_final[-data_final['类型'].isnull()]

ad5eabb34a58789c3718875f6793b2ac.png

  结果很完美,是我想要的。

【方案二】

感觉更全面一点,也更简单一点,是这样↓

先分个列,形成一个新的列表

data["pro"] = data["province"].str.split("、")

2e1c931a3271bbe9fc413faaed0b5410.png

  然后呢,这一步很神奇,explode,就会把列表里面每个元素给分开,前面的其他字段还会跟着填充,很神奇。

data1 = data.explode("pro")

939e8d1f20e3dac89dbf58ba38bf1083.png

最后筛选一下列就行了,这个很简单,就不操作了。

【回到起点】

  那么怎么回到过去呢,想回到最初的起点,这个其实也是很常用的,有的人就喜欢这样,你能怎么办,不给操作就找领导来跟你说,最后还是得操作,还折腾。

  其实就是groupby一下,自定义一个规则就行了。

def func(df):    return '、'.join(df.values)data_2 = data1.groupby(by=['id','name']).agg(func).reset_index()

82c24ab353e61546388842037e3adc9a.png

这就回来了↑

---正文end---

  上面几个字应该能看明白什么意思,说明还有附录部分,如果你仔细看了上面的内容,应该就知道附录部分是什么了。

 【 参数↓】

pandas.melt(frame,  要处理的数据集。            id_vars=None,   不需要被转换的列名。            value_vars=None,  需要转换的列名,如果剩下的列全部都要转换,就不用写了            var_name=None, 自定义设置对应的列名            value_name='value', 自定义设置对应的列名            col_level=None) 如果列是MultiIndex,则使用此级别

先准备一组简单明了的案例数据↓

d = {'ID': ['A001','A002','A003','A004'],      '四川': [1,2,3,4],     '德阳':['d1','d2','d2','d4'],     '成都':['cd1','cd2','cd2','cd4']}df = pd.DataFrame(data=d)

a3fa202599a45ec324fdd3abf8689069.png

  这个的意思就是按照ID列,把其他所有列都放下来,文字不好描述。我给画了个图,看得明白。

73e9a60f98a59956354455a898b97b79.png

pd.melt(df,        id_vars=['ID'],        var_name='区域',        value_name='参数值')

91c1ac6f2ba5d2bc1582d7b9bf7a2f98.png

能看明白吧?这个图画的还是很好地。

再看下面这个图,固定ID和四川两列,把剩下两列放下来。

4371296cae3a322b311ac3ef9e15ac98.png

pd.melt(df,        id_vars=['ID','四川'],        var_name='区域',        value_name='参数值')

最后就是通过value_vars,设置只需要放下来的列,其他就自动删除了。就不想画图了,应该可以领悟到了。

pd.melt(df,        id_vars=['ID'],        value_vars=['德阳'],        var_name='区域',        value_name='参数值')

6d03a6da3be000e1b4b90ca67de3c244.png

4b0dc5ff6164f3a431f63dad9f4224fe.gif

End

7c20af2ee04cf44b0e09506e622eb729.gif

◆ Python高德地图可视化 ◆ Python拼音 ◆ Python_头像动漫化
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值