pandas 实现某一列分组,其他列合并成list

pandas列转换为字典,但将相同第一列(键)的所有值合并为一个键

形式一:

import pandas as pd
# data
data = pd.DataFrame({'column1':['key1','key1','key2','key2'],
    'column2':['value1','value2','value3','value3']})
print(data)
# Grouped dict
data_dict = data.groupby('column1').column2.apply(list).to_dict()
print(data_dict)

输出结果:

 column1 column2
0  key1 value1
1  key1 value2
2  key2 value3
3  key2 value3
{'key1': ['value1', 'value2'], 'key2': ['value3', 'value3']}

形式二:

import pandas as pd
# data
df = pd.DataFrame({'column1':['key1','key1','key2','key2'],
    'column2':['value1','value2','value1','value2'],
    'column3':['value11','value11','value22','value22'],
    'column4':['value44','value44','value55','value55']})
# Grouped dict
data_dict = df.groupby('column1').apply(lambda x: {col:x[col].tolist() for col in x.columns if col != 'column2'}).to_dict()
print(data_dict)
data_dict2 = df.groupby('column1').apply(lambda x: {col:x[col].tolist()[0] if col != 'column2' else x[col].tolist() for col in x.columns}).to_dict()
print(data_dict2)

输出结果:

#data_dict
{
  'key1': {
    'column1': ['key1', 'key1'],
    'column3': ['value11', 'value11'],
    'column4': ['value44', 'value44']
  },
  'key2': {
    'column1': ['key2', 'key2'],
    'column3': ['value22', 'value22'],
    'column4': ['value55', 'value55']
  }
}
#data_dict2
{
  'key1': {
    'column1': 'key1',
    'column2': ['value1', 'value2'],
    'column3': 'value11',
    'column4': 'value44'
  },
  'key2': {
    'column1': 'key2',
    'column2': ['value1', 'value2'],
    'column3': 'value22',
    'column4': 'value55'
  }
}

补充:pandas中,利用groupby分组后,对字符串字段进行合并拼接

在pandas里对于数值字段而言,groupby后可以用sum()、max()等方法进行简单的处理,对于字符串字段, 如果把它们的值拼接在一起,可以用使用 str.cat() 和 lamda 方法。

如,将下面表格中的内容,对skill字段按照id进行分组合并

实现代码:

import pandas as pd
file_name='test.xlsx'
df=pd.read_excel(file_name)
data=df.groupby('id')['skill'].apply(lambda x:x.str.cat(sep=':')).reset_index()
print(data)

效果如下:

另,数据处理时,常常需要将某一列进行拆分,分列,替换等,相关的函数有str.split()、str.extract()、str.replace().

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Pandas中DataFrame的分组/分割/合并的实现

    学习<Python3爬虫.数据清洗与可视化实战>时自己的一些实践. DataFrame分组操作 注意分组后得到的就是Series对象了,而不再是DataFrame对象. import pandas as pd # 还是读取这份文件 df = pd.read_csv("E:/Data/practice/taobao_data.csv", delimiter=',', encoding='utf-8', header=0) # 计算'成交量'按'位置'分组的平均值 groupe

  • pandas group分组与agg聚合的实例

    如下: import pandas as pd df = pd.DataFrame({'Country':['China','China', 'India', 'India', 'America', 'Japan', 'China', 'India'], 'Income':[10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000], 'Age':[5000, 4321, 1234, 4010, 250, 250, 4500, 4321]}) 构造的数

  • pandas组内排序,并在每个分组内按序打上序号的操作

    问题: pandas组内排序,并在每个分组内按序打上序号 描述: pandas dataframe 对dep_id组内的salary排序.希望给下面原本只有前三列的dataframe,添加上第四列. 等价于sql里的排序函数 row_number() over() 功能 假设我已经建好了仅有前三列的dataframe,数据集命名为 MyData, 解决方案如下: MyData['sort_id'] = MyData['salary'].groupby(MyData['dep_id']).rank

  • pandas 实现分组后取第N行

    目的: 把question_id 对应的user_answer转成ABCD solution dfa=df.groupby('question_id').nth(0).reset_index() dfa['flag']='A' dfb=df.groupby('question_id').nth(1).reset_index() dfb['flag']='B' dfc=df.groupby('question_id').nth(2).reset_index() dfc['flag']='C' df

  • pandas分组排序 如何获取第二大的数据

    Python用来做数据分析很方便,网上很多关于找数据中第二大的方法,但是大多数都是关于SQL的,于是我挑战一下用Python来做这件事(主要是SQL写的不好>_<),上代码. 1.数据我是自己编的 在实际工作中应该从数据库中导入数据,如何从数据库导出数据,我之后会补充. import pandas as pd df = pd.DataFrame([ {"class": 1, "name": "aa", "english&qu

  • pandas groupby分组对象的组内排序解决方案

    问题: 根据数据某列进行分组,选择其中另一列大小top-K的的所在行数据 解析: 求解思路很清晰,即先用groupby对数据进行分组,然后再根据分组后的某一列进行排序,选择排序结果后的top-K结果 案例: 取一下dataframe中B列各对象中C值最高所在的行 df = pd.DataFrame({"A": [2, 3, 5, 4], "B": ['a', 'b', 'b', 'a'], "C": [200801, 200902, 200704

  • pandas 实现某一列分组,其他列合并成list

    pandas列转换为字典,但将相同第一列(键)的所有值合并为一个键 形式一: import pandas as pd # data data = pd.DataFrame({'column1':['key1','key1','key2','key2'], 'column2':['value1','value2','value3','value3']}) print(data) # Grouped dict data_dict = data.groupby('column1').column2.a

  • python pandas dataframe 按列或者按行合并的方法

    concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False) objs 是需要拼接的对象集合,一般为列表或者字典 axis=0 是

  • pandas DataFrame的修改方法(值、列、索引)

    对于DataFrame的修改操作其实有很多,不单单是某个部分的值的修改,还有一些索引的修改.列名的修改,类型修改等等.我们仅选取部分进行介绍. 一.值的修改 DataFrame的修改方法,其实前面介绍loc方法的时候介绍了一些. 1. loc方法修改 loc方法实际上是定位某个位置的数据的,但是定位完以后就可以对此位置的数据进行修改,使用此方法可以对DataFrame进行的修改如下: 1.对某行.某N行进行修改: 2.对某列.某N列进行修改: 3.对横坐标为某行或某N行,纵坐标为某列或者某N列的

  • pandas使用apply多列生成一列数据的实例

    如下所示: import pandas as pd def my_min(a, b): return min(abs(a),abs(b)) s = pd.Series([10.0247,10.0470, 10.0647,10.0761,15.0800,10.0761,10.0647,10.0470,10.0247,10.0,9.9753,9.9530,9.9353,9.9239,18.92,9.9239,9.9353,9.9530,9.9753,10.0]) df = pd.DataFrame(

  • 如何使用pandas读取txt文件中指定的列(有无标题)

    最近在倒腾一个txt文件,因为文件太大,所以给切割成了好几个小的文件,只有第一个文件有标题,从第二个开始就没有标题了. 我的需求是取出指定的列的数据,踩了些坑给研究出来了. import pandas as pd # 我们的需求是 取出所有的姓名 # test1的内容 ''' id name score 1 张三 100 2 李四 99 3 王五 98 ''' test1 = pd.read_table("test1.txt") # 这个是带有标题的文件 names = test1[&

  • pandas将list数据拆分成行或列的实现

    数据 import numpy as np import pandas as pd data = [{'Name': '小明', 'Chinese': [70, 80], 'Math': [90, 80]}, {'Name': '小红', 'Chinese': [70, 80, 90], 'Math': [90, 80, 70]}] data = pd.DataFrame(data) data 拆分成行 def split_row(data, column): '''拆分成行 :param da

  • pandas按照列的值排序(某一列或者多列)

    按照某一列排序 d = {'A': [3, 6, 6, 7, 9], 'B': [2, 5, 8, 0, 0]} df = pd.DataFrame(data=d) print('排序前:\n', df) ''' 排序前: A B 0 3 2 1 6 5 2 6 8 3 7 0 4 9 0 ''' res = df.sort_values(by='A', ascending=False) print('按照A列的值排序:\n', res) ''' 按照A列的值排序: A B 4 9 0 3 7

  • pandas将DataFrame的几列数据合并成为一列

    目录 1.1 方法归纳 1.2 .str.cat函数详解 1.2.1 语法格式: 1.2.2 参数说明: 1.2.3 核心功能: 1.2.4 常见范例: 1.1 方法归纳 使用 + 直接将多列合并为一列(合并列较少): 使用pandas.Series.str.cat方法,将多列合并为一列(合并列较多): 范例如下: dataframe["newColumn"] = dataframe["age"].map(str) + dataframe["phone&q

  • python pandas数据处理之删除特定行与列

    目录 dropna() 方法过滤任何含有缺失值的行 方法一:dropna() 其他参数解析 方法二:替换并删除,Python pandas 如果某列值为空,过滤删除所在行数据 总结 dropna() 方法过滤任何含有缺失值的行 pandas.DataFrame里,如果一行数据有任意值为空,则过滤掉整行,这时候使用dropna()方法是合适的.下面的案例,任意列只要有一个为空数据,则整行都干掉.但是我们常常遇到的情况,是根据一个指标(一列)数据的情况,去过滤行数据,类似Excel里面的过滤漏斗,怎

  • Pandas通过index选择并获取行和列

    目录 获取pandas.DataFrame的列 列名称:将单个列作为pandas.Series获得 列名称的列表:将单个或多个列作为pandas.DataFrame获得 获取pandas.DataFrame的行 行名・行号的切片:将单行或多行作为pandas.DataFrame获得 获取pandas.Series的值 标签名称:获取每种类型的单个元素的值 标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得 获取pandas.DataFrame元素的值 行名/列名是整数

随机推荐