pandas中实现将相同ID的字符串进行合并

 更新时间:2023年02月07日 10:25:09   作者:Just_do_it_2018  
这篇文章主要介绍了pandas中实现将相同ID的字符串进行合并问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

问题描述

"""
id   value
1      A
1      B
1      C
2      D
2      E
2      F
变为:
id  value
1   [A,B,C]
2   [D,E,F]

pandas怎么把上面的结构变为下面的形式?
"""

自己的解决方案

import pandas as pd
import numpy as np
data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']})

data1 = np.array(data.groupby(['id']))#按照id进行分类
# 转变成array对象之后,可以根据data1[0][1]查看其结构

id_kinds = 2#id的种类,此例比如1、2共两种
all_value = []
for j in range(2):
    value = []
    for i in data1[j][1]['value']:
        value.append(i)
    all_value.append(value)
print(all_value)

#再创建新的dataframe
new_data = pd.DataFrame({'id':[1,2],'value':all_value})
print(new_data)

输出结果为:

   id      value
0   1  [A, B, C]
1   2  [D, E, F]

大神的更优化的解法

解法一:

可以用sum方法,将字符串进行连接

import pandas as pd
import numpy as np
data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']})
data1 = data.groupby(by='id')['value'].sum()

此时的输出结果为:

id
1    ABC
2    DEF
Name: value, dtype: object

但是还不是我们想要的,因为我们还需要在中间加入逗号分隔

① 我们可以先将原始数据的value都变成“,A”

data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']})
data['value'] = data['value'].apply(lambda x:','+ x)

② 然后,对其使用sum方法进行字符串相加

data1 = data.groupby(by='id').sum()

此时的输出结果为,value值之前多了“,”

id  value
1   ,A,B,C
2   ,D,E,F

③ 最后,对该列使用apply函数,去除‘,’

data1['value'] = data1['value'].apply(lambda x :[x[1:]])

就得到了最终的结果:

id  value
1   [A,B,C]
2   [D,E,F]

解法二:

对分组之后的结果,直接使用apply函数

一行代码就搞定!

data1 = data.groupby(by='id').apply(lambda x:[','.join(x['value'])])

那为什么可以这么做呢?

首先需要剖析的是,groupby之后的数据结构是什么样的,它是由元组构成的(分组名,数据块),数据块也就是dataframe结构。使用以下方式可以查看groupby之后的对象:

for ID,group in group_df:
    print(ID)
    print(group)

apply函数中的x作用的即是数据块(dataframe),通过数据块取value那一行得到的是Series对象,于是可以使用join方法进行操作。

总结

sum方法不仅可以用于数值计算,还可用于对于一个Series对象而言的字符串相加

a = ['a','b']
c = pd.Series(a).sum()

apply函数非常灵活,不仅可以作用于一个Series对象,还可以作用于一个groupby之后的数据块

data['value'].apply(lambda x :*****)
data.groupby(by='**').apply(lambda x :*****)

lambda匿名函数可以极大优化精简我们的代码,是一个非常灵活好用的函数,记住它!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python where函数保姆级使用教程

    Python where函数保姆级使用教程

    本文主要和大家介绍了详解Python中where()函数的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参,希望能帮助到大家
    2022-06-06
  • 教你使用Python画圣诞树做浪漫的程序员

    教你使用Python画圣诞树做浪漫的程序员

    这不是圣诞节快到了,还不用Python绘制个圣诞树和烟花让女朋友开心开心,也算是亲手做的,稍稍花了点心思,学会了赶紧画给你的那个她吧
    2022-12-12
  • python argparse模块传参用法实例

    python argparse模块传参用法实例

    这篇文章主要为大家介绍了python argparse模块传参用法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Python中用PIL库批量给图片加上序号的教程

    Python中用PIL库批量给图片加上序号的教程

    这篇文章主要介绍了Python中用PIL库批量给图片加上序号的教程,PIL库是Python中一个非常强大的处理图片的库,需要的朋友可以参考下
    2015-05-05
  • 基于python利用Pyecharts使高清图片导出并在PPT中动态展示

    基于python利用Pyecharts使高清图片导出并在PPT中动态展示

    这篇文章主要介绍了基于python利用Pyecharts使高清图片导出并在PPT中动态展示,pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库,下面来看看具体的实现过程吧,需要的小伙伴也可以参考一下
    2022-01-01
  • Python+OpenCV目标跟踪实现基本的运动检测

    Python+OpenCV目标跟踪实现基本的运动检测

    这篇文章主要为大家详细介绍了Python+OpenCV目标跟踪实现基本的运动检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • python两种注释用法的示例

    python两种注释用法的示例

    这篇文章主要介绍了python两种注释用法的示例,帮助大家开始学习和使用python 注释,感兴趣的朋友可以了解下
    2020-10-10
  • Sanic框架蓝图用法实例分析

    Sanic框架蓝图用法实例分析

    这篇文章主要介绍了Sanic框架蓝图用法,结合实例形式分析了Sanic框架中蓝图的功能以及路由控制中蓝图的定义、注册、简单使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-07-07
  • Python+selenium 获取浏览器窗口坐标、句柄的方法

    Python+selenium 获取浏览器窗口坐标、句柄的方法

    今天小编就为大家分享一篇Python+selenium 获取浏览器窗口坐标、句柄的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 浅谈django model postgres的json字段编码问题

    浅谈django model postgres的json字段编码问题

    下面小编就为大家分享一篇浅谈django model postgres的json字段编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论