【问题标题】:Pandas column creationPandas 列创建
【发布时间】:2016-04-28 20:00:04
【问题描述】:

鉴于以下创建新列的尝试之一似乎失败,我很难理解列命名约定背后的概念:

from numpy.random import randn
import pandas as pd

df = pd.DataFrame({'a':range(0,10,2), 'c':range(0,1000,200)},
columns=list('ac'))
df['b'] = 10*df.a
df

给出以下结果:

但是,如果我尝试通过替换以下行来创建 b 列,则不会出现错误消息,但数据框 df 仅保留 a 和 c 列。

df.b = 10*df.a   ### rather than the previous df['b'] = 10*df.a ###

pandas 做了什么,为什么我的命令不正确?

【问题讨论】:

  • 如果 b 列已经存在,则 df.b = 10*df.a 有效!

标签: python pandas columnname


【解决方案1】:

您所做的是将属性 b 添加到您的 df:

In [70]:
df.b = 10*df.a 
df.b

Out[70]:
0     0
1    20
2    40
3    60
4    80
Name: a, dtype: int32

但我们看到没有添加新列:

In [73]:    
df.columns

Out[73]:
Index(['a', 'c'], dtype='object')

这意味着如果我们尝试df['b'],我们会得到KeyError,为避免这种歧义,您应该在分配时始终使用方括号。

例如,如果您有一个名为index 或sum 或max 的列,那么执行df.index 将返回索引而不是索引列,同样df.sum 和df.max 会搞砸这些df 方法。

我强烈建议始终使用方括号,它可以避免任何歧义,并且最新的 ipython 能够使用方括号解析列名。将数据框视为系列的字典也很有用,其中使用方括号来分配和返回列是有意义的

【讨论】:

  • 点符号也不适用于整数索引(即df.1)
  • @ayhan 那是因为它是一个非法的属性名称,如果您在列名称中有一个空格并尝试使用点表示法访问它,也会发生同样的事情,请参阅stackoverflow.com/questions/10120295/…
【解决方案2】:

始终使用方括号来分配列

点表示法便于访问数据框中的列。如果它们与现有属性冲突(例如,如果您有一个名为“max”的列),那么您需要使用方括号来访问该列,例如df['max']。当列名包含空格时,您还需要使用方括号,例如df['max value'].

DataFrame 只是一个具有常用属性和方法的对象。如果您使用点符号进行赋值,则您正在为数据框对象创建属性或方法。所以df.val = 2 将为df 分配一个值为2 的属性val。这与 df['val'] = 2 非常不同,后者在数据框中创建一个新列,并为该列中的每个元素分配值 2。

为了安全起见,使用方括号表示法将始终提供正确的结果。

顺便说一句,您的columns=list('ac')) 没有做任何事情,因为您只是创建了一个从未使用过的名为columns 的变量。您的意思可能是df.columns = list('ac'),但您已经在创建数据框时分配了它们,所以我不确定这行代码的意图是什么。请记住,字典是无序的,因此pd.DataFrame({'a': [...], 'b': [...]}) 可能会返回包含列 ['b', 'a'] 的数据框。如果是这种情况,那么分配列名可能会混淆列标题。

【讨论】:

    【解决方案3】:

    这个问题与 python 中如何处理属性有关。在 python 中为类设置新属性没有限制,所以例如你可以做类似的事情

    df.myspecialstuff = ["dog", "cat", 5]
    

    所以当你做作业时

    df.b = 10*df.a
    

    不明确是要添加属性还是新列,设置了属性。实际查看发生了什么的最简单方法是使用 pdb 并逐步执行代码

    import pdb
    x = df.a
    pdb.run("df.a1 = x")
    

    这将进入__setattr__(),而pdb.run("df['a2'] = x") 将进入__setitem__()

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 2019-06-05
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2021-10-09
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多