【问题标题】:Inconsistent results when adding a new column in Pandas DataFrame. Is it a Series or a Value?在 Pandas DataFrame 中添加新列时结果不一致。它是一个系列还是一个值?
【发布时间】:2019-09-03 09:22:42
【问题描述】:

所以我知道我可以像这样在 Pandas 中简单地添加一个新列:

df
=====
  A
1 5
2 6
3 7

df['new_col'] = "text"

df
====
  A    new_col
1 5    text
2 6    text
3 7    text

而且我还可以根据对现有列的操作设置新列。

def times_two(x):
    return x * 2

df['newer_col'] = time_two(df.a)
df
====
  A    new_col   newer_col
1 5    text      10
2 6    text      12
3 7    text      14

但是,当我尝试对文本列进行操作时,我得到了一个意外的 AttributeError。

df['new_text'] = df['new_col'].upper()
AttributeError: 'Series' object has no attribute 'upper'

它现在将值视为一个系列,而不是那个“单元格”中的值。

为什么文本会发生这种情况而不是数字会发生这种情况?如何使用基于现有文本列的新列更新我的 DF?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是因为 * 运算符被实现为 mul 运算符,而 upper 没有为 Series 定义。您必须使用str.upper,它是为Series 实现的,其中dtype 是str

    In[53]:
    df['new_text'] = df['new_col'].str.upper()
    df
    
    Out[53]: 
       A new_col new_text
    1  5    text     TEXT
    2  6    text     TEXT
    3  7    text     TEXT
    

    这里没有魔法。

    对于df['new_col'],这只是分配一个标量值并符合broadcasting 规则,其中标量沿短轴广播到df 的长度,有关说明,请参见此:What does the term "broadcasting" mean in Pandas documentation?

    【讨论】:

    • 嘿。所以谢谢。我想这里发生了一些低级的事情。我的实际用例是尝试对文本字段进行 sha256 编码。首先需要将其编码为 utf-8。当我尝试对文本字段进行任何操作时——包括编码——我得到了错误。是通过 .str 版本的解决方案吗?
    • 如果我的回答解决了你的问题,那么别忘了接受它,我的回答左上角会有一个空勾号。
    • 我做到了。但出于某种原因,SO 决定删除我过去十年的积分并将我重置为零。因此,虽然我已对您的评论表示赞同,但它不允许我展示它。
    • 好的。所以现在当我通过它时,我看到它是“”,但它仍然没有正确处理它。有什么进一步的指导吗?
    • 对不起,您需要发布代码而不是错误描述
    猜你喜欢
    • 2017-03-07
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2015-02-02
    • 2023-02-05
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多