当前位置: 首页 > 面试题库 >

pandas:同时分配多个* new *列

何修能
2023-03-14
问题内容

我有一个DataFrame,其中的一列包含每行的标签(除了每行的一些相关数据)。我有一本字典,其键等于可能的标签,而值等于与该标签相关的信息的2元组。我想在框架上添加两个新列,每个对应于标签的2元组的每一部分。

这是设置:

import pandas as pd
import numpy as np

np.random.seed(1)
n = 10

labels = list('abcdef')
colors = ['red', 'green', 'blue']
sizes = ['small', 'medium', 'large']

labeldict = {c: (np.random.choice(colors), np.random.choice(sizes)) for c in labels}

df = pd.DataFrame({'label': np.random.choice(labels, n), 
                   'somedata': np.random.randn(n)})

我可以通过运行获得想要的东西:

df['color'], df['size'] = zip(*df['label'].map(labeldict))
print df

  label  somedata  color    size
0     b  0.196643    red  medium
1     c -1.545214  green   small
2     a -0.088104  green   small
3     c  0.852239  green   small
4     b  0.677234    red  medium
5     c -0.106878  green   small
6     a  0.725274  green   small
7     d  0.934889    red  medium
8     a  1.118297  green   small
9     c  0.055613  green   small

但是,如果我不想手动在作业左侧键入两列,该怎么办?即,如何动态创建多个新列。例如,如果我有10个元组labeldict而不是2个元组,那么这将是当前所写的真正痛苦。这有几项无效:

# set up attrlist for later use
attrlist = ['color', 'size']

# non-working idea 1)
df[attrlist] = zip(*df['label'].map(labeldict))

# non-working idea 2)
df.loc[:, attrlist] = zip(*df['label'].map(labeldict))

确实可以,但是似乎很简单:

for a in attrlist:
    df[a] = 0
df[attrlist] = zip(*df['label'].map(labeldict))

更好的解决方案?


问题答案:

您可以改为使用合并:

>>> ld = pd.DataFrame(labeldict).T
>>> ld.columns = ['color', 'size']
>>> ld.index.name = 'label'
>>> df.merge(ld.reset_index(), on='label')
  label  somedata  color    size
0     b  1.462108    red  medium
1     c -2.060141  green   small
2     c  1.133769  green   small
3     c  0.042214  green   small
4     e -0.322417    red  medium
5     e -1.099891    red  medium
6     e -0.877858    red  medium
7     e  0.582815    red  medium
8     f -0.384054    red   large
9     d -0.172428    red  medium


 类似资料:
  • 问题内容: 我的印象是,尽管语法有所不同,但下面的函数a和b在逻辑上是等效的。但是,它们不是,我也不了解它们之间的区别。 在我看来,他们俩都在分配: x对变量z的值, y的值对应于变量x,并且 x + y的值等于变量y。 有人能帮助消除我对多变量分配以及函数a和函数b之间的逻辑差异的误解吗? 问题答案: 分配可以认为是“原子”操作。也就是说,认为在所有操作完成之前,“ 左侧”的所有值都是“冻结”的

  • 问题内容: 我在python中使用队列时,即使代码对我来说看起来很完美,但我仍然在代码中出现错误,但是后来当我突然更改赋值样式时,代码开始工作。该代码看起来像以前一样。 后来我改变了这个,它开始工作 为什么两个代码的工作方式不同? 问题答案: Python中的变量是引用或名称,不像C中的变量等。 这段代码: 表示“允许名称引用通过调用在内存中创建的对象,并允许该名称引用指向的对象。” 这意味着两个

  • 问题内容: 这个问题已经在这里有了答案 : 如何在熊猫中处理SettingWithCopyWarning (15个答案) 1年前关闭。 我有一个要扩展的列,其中包含上一行的数据。 此脚本可以完成以下任务: 它输出: 这正是我想要的。在现在有两个附加列和包含列的值 1 点 2 之前的行。 但是,我也得到警告: 问题肯定来自我创建之前的过滤。如果我直接工作,则不会发生此问题。在我的应用程序中,我需要分

  • 问题内容: 我很想知道是否有一种“ pythonic”的方法来将列表中的值分配给元素?更清楚地说,我要的是这样的东西: 以便: 我正在寻找比手动执行任何其他更好的选择: 问题答案: 只需输入: 当您像上面那样被分配给多个变量时,Python就会使用。 在此扩展中,您还可以解压缩为多个小于使用star运算符的长度的变量:

  • 我的Java代码有问题。我想在一个键中存储多个值,但我想灵活地存储它们。这意味着我从一个文本文件中读取,每行是一个单词。为了储存它们,我想建立成对的单词。例如: 字1/字2 单词2/单词3 单词3/单词4 我已经稍微改变了这种方法。我想将键的值存储在数组列表中。这意味着每次出现新键时都会存储一个新的 Arraylist 和键,但如果键在映射中,我想将它们存储在这个键的列表中。这可能吗? 我们必须将

  • 问题内容: 我想在中设置多列的(我有一个文件,我不得不手动将其解析为列表列表,因为该文件不适合) 我懂了 我可以设置它们的唯一方法是循环遍历每个列变量并使用重铸。 有没有更好的办法? 问题答案: 从0.17开始,您必须使用显式转换: (如下所述,在0.17中已不再使用“魔术”了) 您可以将它们应用于要转换的每一列: 并确认dtype已更新。 适用于大熊猫0.12-0.16的旧/建议答案:您可以用来