我有一个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的旧/建议答案:您可以用来