将行中的元组转换为 Dataframe 中的新列,必须使用 pandas 0.21

2023-12-22

我有包含元组列表的列,并且想将此元组转换为新列。 (注意:必须使用pandas 0.21;由于我的项目要求无法升级。) 请看下面的例子:

df = pd.DataFrame(dict(a=[1,2,3],
                  b=['a', 'a', 'b'],
                  c=[[('pear', 1), ('apple', 2)], [('pear', 7), ('orange', 1)], [('apple', 9)] ]))
df

    a   b   c
0   1   a   [(pear, 1), (apple, 2)]
1   2   a   [(pear, 7), (orange, 1)]
2   3   b   [(apple, 9)]

并想将其转换为

    a   b   fruit   value
0   1   a   pear    1
1   1   a   apple   2
2   2   a   pear    7
3   2   a   orange  1
4   3   b   apple   9

我可以做到,但效率并不高,就我而言,我有超过 500K 的行。有更有效的方法吗?

UPDATE:

下面提出的所有三种解决方案都非常适合pandas >=0.25。对于早期版本df.explode不是一个选择。而对于pandas < 0.24没有df.to_numpy所以早期版本的唯一解决方案是@jezreal的解决方案

下面是一个小基准(pandas == 0.25)(令人惊讶的是爆炸速度更慢):

from itertools import product, chain

def sol_1(df):
    phase1 = (product([a],b,c) for a,b,c in df.to_numpy())
    phase2 = [(a,b,*c) for a, b, c in chain.from_iterable(phase1)]
    return pd.DataFrame(phase2, columns = ["a","b","fruit","value"])


def sol_2(df): 
    df1 = pd.DataFrame([(k, *x) for k, v in df.c.items() for x in v],
                   columns=['i','fruit','value'])
    df = df.merge(df1, left_index=True, right_on='i').drop('i', axis=1)
    return df

def sol_3(df):
    df = df.explode('c')
    df[['fruit', 'value']] = pd.DataFrame(df['c'].tolist(), index=df.index)
    del df['c']
    return df

%timeit sol_1(df)
%timeit sol_2(df)
%timeit sol_3(df)

586 µs ± 6.39 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2.8 ms ± 206 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.14 ms ± 28.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

想法是将列表理解中的值重塑为新的 DataFrame,然后使用DataFrame.merge http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html:

df1 = pd.DataFrame([(k, *x) for k, v in df.pop('c').items() for x in v],
                   columns=['i','fruit','value'])

print (df1)
   i   fruit  value
0  0    pear      1
1  0   apple      2
2  1    pear      7
3  1  orange      1
4  2   apple      9        

df = df.merge(df1, left_index=True, right_on='i').drop('i', axis=1)
print (df)
   a  b   fruit  value
0  1  a    pear      1
1  1  a   apple      2
2  2  a    pear      7
3  2  a  orange      1
4  3  b   apple      9
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将行中的元组转换为 Dataframe 中的新列,必须使用 pandas 0.21 的相关文章

  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 如何正确地将 MIDI 刻度转换为毫秒?

    我正在尝试将 MIDI 刻度 增量时间转换为毫秒 并且已经找到了一些有用的资源 MIDI Delta 时间刻度到秒 http www lastrayofhope co uk 2009 12 23 midi delta time ticks
  • 在 Tensorflow tf.nn.nce_loss 中出现 TypeError:'Mul' Op 的输入 'y' 的类型为 float32,与参数 'x' 的 int32 类型不匹配

    我正在研究 Tensor Flow 中的 Bag of Words 实现 并得到了 类型错误 Mul Op 的输入 y 的类型为 float32 与参数 x 的 int32 类型不匹配 在 tf nn nce loss 中 我尝试查看 tf
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • 为什么Python的curses中escape键有延迟?

    In the Python curses module I have observed that there is a roughly 1 second delay between pressing the esc key and getc
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 如何设置 Celery 来调用自定义工作器初始化?

    我对 Celery 很陌生 我一直在尝试设置一个具有 2 个独立队列的项目 一个用于计算 另一个用于执行 到目前为止 一切都很好 我的问题是执行队列中的工作人员需要实例化一个具有唯一 object id 的类 每个工作人员一个 id 我想知
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 按元组分隔符拆分列表

    我有清单 print L I WW am XX newbie YY ZZ You WW are XX cool YY ZZ 我想用分隔符将列表拆分为子列表 ZZ print new L I WW am XX newbie YY ZZ You
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • 将 2D NumPy 数组按元素相乘并求和

    我想知道是否有一种更快的方法 专用 NumPy 函数来执行 2D NumPy 数组的元素乘法 然后对所有元素求和 我目前使用np sum np multiply A B 其中 A B 是相同维度的 NumPy 数组m x n 您可以使用np
  • 使用 NumPy 将非均匀数据从文件读取到数组中

    假设我有一个如下所示的文本文件 33 346 1223 10 23 11 23 12 23 13 23 14 23 15 23 16 24 10 24 11 24 12 24 13 24 14 24 15 24 16 25 14 25 15
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • 如何为每个屏幕添加自己的 .py 和 .kv 文件?

    我想为每个屏幕都有一个单独的 py 和 kv 文件 应通过 main py main kv 中的 ScreenManager 选择屏幕 设计应从文件 screen X kv 加载 类等应从文件 screen X py 加载 Screens
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • 检查字典键是否有空值

    我有以下字典 dict1 city name yass region zipcode phone address tehsil planet mars 我正在尝试创建一个基于 dict1 的新字典 但是 它不会包含带有空字符串的键 它不会包
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐