我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何融化 pandas 数据框?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何融化 pandas 数据框?

问题内容

在 pandas 标签上,我经常看到用户询问有关在 pandas 中融化数据帧的问题。我将尝试针对这个主题进行规范的问答(自我回答)。

我要澄清:

  1. 什么是熔化?

  2. 如何使用melt?

  3. 什么时候使用melt?

我看到一些有关融化的热门问题,例如:

  • 使用 pandas 将列转换为行:这个实际上可能很好,但更多的解释会更好。

  • pandas melt function:一个很好的问题,答案也很好,但是有点太模糊了,没有太多解释。

  • 融化 pandas 数据框:也是一个很好的答案!但这只是针对特定情况,这很简单,只有 pd.melt(df)

  • pandas 数据框使用列作为行(融化):非常整洁!但问题是,它仅针对op提出的具体问题,也需要使用pivot_table

所以我将尝试针对这个主题进行规范的问答。

数据集:

我将在这个随机年龄的随机人的随机成绩数据集中找到所有答案(更容易解释答案:d):

import pandas as pd
df = pd.dataframe({'name': ['bob', 'john', 'foo', 'bar', 'alex', 'tom'],
                   'math': ['a+', 'b', 'a', 'f', 'd', 'c'],
                   'english': ['c', 'b', 'b', 'a+', 'f', 'a'],
                   'age': [13, 16, 16, 15, 15, 13]})
>>> df
   name math english  age
0   bob   a+       c   13
1  john    b       b   16
2   foo    a       b   16
3   bar    f      a+   15
4  alex    d       f   15
5   tom    c       a   13

问题:

问题 1:

如何融化数据框以使原始数据框变为以下内容?

    name  age  subject grade
0    bob   13  english     c
1   john   16  english     b
2    foo   16  english     b
3    bar   15  english    a+
4   alex   17  english     f
5    tom   12  english     a
6    bob   13     math    a+
7   john   16     math     b
8    foo   16     math     a
9    bar   15     math     f
10  alex   17     math     d
11   tom   12     math     c

我想对其进行转置,以便一列是每个科目,其他列是学生的重复姓名及其年龄和分数。

问题 2:

这和问题1类似,但是这次我想让问题1输出subject列只有math,我想过滤掉english列:

   name  age subject grades
0   bob   13    math     a+
1  john   16    math      b
2   foo   16    math      a
3   bar   15    math      f
4  alex   15    math      d
5   tom   13    math      c

我希望输出如上所示。

问题 3:

如果我要对熔化进行分组并按学生的分数排序,我该如何做到这一点,以获得如下所示的所需输出:

  value             name                subjects
0     a         foo, tom           math, english
1    a+         bob, bar           math, english
2     b  john, john, foo  math, english, english
3     c         tom, bob           math, english
4     d             alex                    math
5     f        bar, alex           math, english

我需要对其进行排序,名称用逗号分隔,并且 subjects 分别以相同的顺序用逗号分隔。

问题 4:

我如何解冻一个熔化的数据框?假设我已经融化了这个数据框:

df = df.melt(id_vars=['name', 'age'], var_name='subject', value_name='grades')

成为:

    name  age  subject grades
0    bob   13     math     a+
1   john   16     math      b
2    foo   16     math      a
3    bar   15     math      f
4   alex   15     math      d
5    tom   13     math      c
6    bob   13  english      c
7   john   16  english      b
8    foo   16  english      b
9    bar   15  english     a+
10  alex   15  english      f
11   tom   13  english      a

那么我如何将其转换回原始数据框,如下所示?

   name math english  age
0   bob   a+       c   13
1  john    b       b   16
2   foo    a       b   16
3   bar    f      a+   15
4  alex    d       f   15
5   tom    c       a   13

问题 5:

如果我要按学生姓名分组并用逗号分隔科目和成绩,我会怎么做?

   name        subject grades
0  alex  math, english   d, f
1   bar  math, english  f, a+
2   bob  math, english  a+, c
3   foo  math, english   a, b
4  john  math, english   b, b
5   tom  math, english   c, a

我想要一个像上面这样的数据框。

问题 6:

如果我要完全融化我的数据框,所有列都作为值,我会怎么做?

     Column Value
0      Name   Bob
1      Name  John
2      Name   Foo
3      Name   Bar
4      Name  Alex
5      Name   Tom
6      Math    A+
7      Math     B
8      Math     A
9      Math     F
10     Math     D
11     Math     C
12  English     C
13  English     B
14  English     B
15  English    A+
16  English     F
17  English     A
18      Age    13
19      Age    16
20      Age    16
21      Age    15
22      Age    15
23      Age    13

我想要一个像上面这样的数据框。所有列作为值。


正确答案


pandas 版本 < 0.20.0 的注意事项:我将使用 df.melt(...) 作为我的示例,但您需要使用 pd.melt(df, .. .) 代替。

文档参考:

这里的大多数解决方案都将与 melt< 一起使用/a>,所以要知道方法melt ,请参阅文档说明。

熔化逻辑:

melting合并多列,将dataframe由宽转长,解决问题1(见下文),步骤为:

  1. 首先我们得到了原始数据帧。

  2. 然后,melt 首先合并 mathenglish 列,并使数据帧复制(更长)。

  3. 最后它添加了 subject 列,它分别是 grades 列值的主题:

这是 melt 函数的简单逻辑。

解决方案:

问题 1:

问题 1 可以使用 pd.dataframe.melt 解决 使用以下代码:

print(df.melt(id_vars=['name', 'age'], var_name='subject', value_name='grades'))

此代码将 id_vars 参数传递给 ['name', 'age'],然后自动将 value_vars 设置为其他列(['math', 'english']),这是转置的转换为该格式。

您还可以使用 stack 像下面这样:

print(
    df.set_index(["name", "age"])
    .stack()
    .reset_index(name="grade")
    .rename(columns={"level_2": "subject"})
    .sort_values("subject")
    .reset_index(drop=true)
)

此代码将 nameage 列设置为索引,并堆叠其余列 mathenglish,并重置索引并指定 grade 作为列名称,然后将其他列重命名为 level_2phpcnendcphp cn 到 subject 然后按subject 列,最后再次重置索引。

这两个解决方案输出:

    name  age  subject grade
0    bob   13  english     c
1   john   16  english     b
2    foo   16  english     b
3    bar   15  english    a+
4   alex   17  english     f
5    tom   12  english     a
6    bob   13     math    a+
7   john   16     math     b
8    foo   16     math     a
9    bar   15     math     f
10  alex   17     math     d
11   tom   12     math     c

问题 2:

这和我的第一个问题类似,但是这个我只在 math 列中进行过滤,这时候 value_vars 参数就可以派上用场了,如下所示:

print(
    df.melt(
        id_vars=["name", "age"],
        value_vars="math",
        var_name="subject",
        value_name="grades",
    )
)

或者我们也可以使用 stack 与列规格:

print(
    df.set_index(["name", "age"])[["math"]]
    .stack()
    .reset_index(name="grade")
    .rename(columns={"level_2": "subject"})
    .sort_values("subject")
    .reset_index(drop=true)
)

这两种解决方案都给出:

   name  age subject grade
0   bob   13    math    a+
1  john   16    math     b
2   foo   16    math     a
3   bar   15    math     f
4  alex   15    math     d
5   tom   13    math     c

问题 3:

问题3可以通过melt解决和 groupby,使用 agg 函数和 ' , '.join,如下所示:

print(
    df.melt(id_vars=["name", "age"])
    .groupby("value", as_index=false)
    .agg(", ".join)
)

它会融合数据框,然后按等级进行分组,聚合它们并用逗号将它们连接起来。

stack也可以用来解决这个问题,与 stackgroupby 如下所示:

print(
    df.set_index(["name", "age"])
    .stack()
    .reset_index()
    .rename(columns={"level_2": "subjects", 0: "grade"})
    .groupby("grade", as_index=false)
    .agg(", ".join)
)

这个 stack 函数只是转置数据帧以相当于 melt 的方式,然后重置索引,重命名列、组和聚合。

两种解决方案输出:

  grade             name                subjects
0     a         foo, tom           math, english
1    a+         bob, bar           math, english
2     b  john, john, foo  math, english, english
3     c         bob, tom           english, math
4     d             alex                    math
5     f        bar, alex           math, english

问题 4:

这可以通过 pivot_table 来解决。我们必须指定参数 valuesindexcolumns 以及 aggfunc

我们可以用下面的代码来解决这个问题:

print(
    df.pivot_table("grades", ["name", "age"], "subject", aggfunc="first")
    .reset_index()
    .rename_axis(columns=none)
)

输出:

   name  age english math
0  alex   15       f    d
1   bar   15      a+    f
2   bob   13       c   a+
3   foo   16       b    a
4  john   16       b    b
5   tom   13       a    c

融化的数据帧被转换回与原始数据帧完全相同的格式。

我们首先旋转融化的数据框,然后重置索引并删除列轴名称。

问题 5:

问题5可以通过melt解决和 groupby 如下所示:

print(
    df.melt(id_vars=["name", "age"], var_name="subject", value_name="grades")
    .groupby("name", as_index=false)
    .agg(", ".join)
)

融化并按 name 分组。

或者您可以stack

print(
    df.set_index(["name", "age"])
    .stack()
    .reset_index()
    .groupby("name", as_index=false)
    .agg(", ".join)
    .rename({"level_2": "subjects", 0: "grades"}, axis=1)
)

两个代码输出:

   name       subjects grades
0  alex  math, english   d, f
1   bar  math, english  f, a+
2   bob  math, english  a+, c
3   foo  math, english   a, b
4  john  math, english   b, b
5   tom  math, english   c, a

问题 6:

问题6可以通过melt解决并且不需要指定列,只需指定预期的列名称:

print(df.melt(var_name='column', value_name='value'))

这会融化整个数据框。

或者您可以stack

print(
    df.stack()
    .reset_index(level=1)
    .sort_values("level_1")
    .reset_index(drop=true)
    .set_axis(["column", "value"], axis=1)
)

两个代码输出:

     Column Value
0       Age    16
1       Age    15
2       Age    15
3       Age    16
4       Age    13
5       Age    13
6   English    A+
7   English     B
8   English     B
9   English     A
10  English     F
11  English     C
12     Math     C
13     Math    A+
14     Math     D
15     Math     B
16     Math     F
17     Math     A
18     Name  Alex
19     Name   Bar
20     Name   Tom
21     Name   Foo
22     Name  John
23     Name   Bob

以上就是如何融化 pandas 数据框?的详细内容,更多请关注编程网其它相关文章!

如何融化 pandas 数据框?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何融化 pandas 数据框?

问题内容在 pandas 标签上,我经常看到用户询问有关在 pandas 中融化数据帧的问题。我将尝试针对这个主题进行规范的问答(自我回答)。我要澄清:什么是熔化?如何使用melt?什么时候使用melt?我看到一些有关融化的热门问题,例
如何融化 pandas 数据框?
2024-02-10

pandas如何筛选数据

pandas筛选数据的的方法:1、导入Pandas库;2、读取数据;3、筛选数据;4、排序数据;5、分组聚合数据等。详细介绍:1、导入Pandas库,首先确保已安装Pandas库,如果没有安装,可以使用“pip install pandas
pandas如何筛选数据
2023-11-22

保留数据类型的空 pandas 数据框

问题内容我想用保留的数据类型创建一个空的 df 作为模板。代码如下:import pandas as pdimport datetimefrom dataclasses import dataclass@dataclassclas
保留数据类型的空 pandas 数据框
2024-02-22

pandas如何读取mysql数据

目录pandas读取mysql数据pandas读取mysql数据到DataFrame方法一方法二总结pandas读取mysql数据def get_data():conn = pymysql.connect(host=RSYS_HOST,p
2022-12-17

pandas如何连接mysql数据库

Pandas提供了一个read_sql方法来连接和从MySQL数据库中读取数据。首先,您需要安装MySQL的Python驱动程序(例如pymysql),然后使用以下代码连接到MySQL数据库并读取数据:import pandas as p
pandas如何连接mysql数据库
2024-05-06

Pandas如何实现分组数据

这篇文章给大家分享的是有关Pandas如何实现分组数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分组数据这种操作在数据科学家和分析师的日常生活中经常执行。Pandas提供了一个基本的函数来执行数据分组,即Gr
2023-06-27

Pandas如何实现数据的存储

这篇文章给大家分享的是有关Pandas如何实现数据的存储的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数据的存储数据可以有两种类型-连续的和离散的,这取决于我们的分析要求。有时我们不需要连续变量中的精确值,但需要
2023-06-26

如何查询你的Pandas数据帧?

无论您从数据工程师/数据分析师转型而来,还是想成为更高效的数据科学家,查询数据帧都是返回所需特定行的一种很有用的方法。值得一提的是,pandas有一个特定的查询函数,名为query。

Pandas数据透视的函数如何使用

这篇文章主要介绍了Pandas数据透视的函数如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Pandas数据透视的函数如何使用文章都会有所收获,下面我们一起来看看吧。pandas.melt()melt函数
2023-07-02

如何使用Pandas和SQL分析数据

我们在本教程中将探讨何时以及如何将SQL功能整合到Pandas框架中,并探讨其局限性。

如何使用pandas进行数据分析

这篇文章主要介绍了如何使用pandas进行数据分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。(一)获取微信好友的数据为了获取微信好友的数据,需要使用一个工具,叫itcha
2023-06-19

pandas数据清洗如何实现删除

这篇文章主要介绍“pandas数据清洗如何实现删除”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“pandas数据清洗如何实现删除”文章能帮助大家解决问题。准备工作(导入库、导入数据)import p
2023-07-02

如何优化 Java 工作流框架中的数据库交互?(java工作流框架如何优化数据库交互 )

在Java开发中,工作流框架的使用越来越广泛,而数据库交互是其中的关键部分。良好的数据库交互优化可以提高系统的性能、稳定性和可扩展性。以下是一些关于如何优化Java工作流框架中数据库交互的方法:一、使用连接池连接池是优化
如何优化 Java 工作流框架中的数据库交互?(java工作流框架如何优化数据库交互  )
Java2024-12-16

pandas中如何创建category类型数据

这篇文章主要介绍了pandas中如何创建category类型数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 T1、直接创建 category类型数据可知,在categor
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录