Непоследовательные результаты при добавлении нового столбца в Pandas DataFrame. Это серия или ценность? - PullRequest
2 голосов
/ 12 апреля 2019

Итак, я знаю, что могу добавить новый столбец в Пандах следующим образом:

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 новым столбцом на основе существующего текстового столбца?

1 Ответ

1 голос
/ 12 апреля 2019

Это потому, что оператор * реализован как оператор 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 вдоль малой оси, см. объяснение этого: Что означает термин «трансляция» в пандахдокументация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...