Объект 'str' не поддерживает назначение элемента с фреймом данных - PullRequest
1 голос
/ 05 мая 2020

У меня есть фрейм данных, и я пытаюсь добавить столбец к данным.

import numpy as np
import pandas as pd
import random as rnd

all_df = pd.read_csv('Cleaned-Data.csv')

for dataset in all_df:
    dataset['Severity'] = 1

Когда я запускаю приведенный выше код, я получаю следующую ошибку:

TypeError                                 Traceback (most recent call last)
<ipython-input-38-d3aa149f309c> in <module>
      1 for dataset in all_df:
----> 2     dataset['Severity'] = 1

TypeError: 'str' object does not support item assignment

Я хотел добавить немного больше к проблеме. На самом деле мне не нужно добавлять один столбец с добавлением только одного значения. Я пытался упростить задачу, чтобы попытаться понять, что не так.

Ниже приведен модифицированный код.

import numpy as np
import pandas as pd
import random as rnd

all_df = pd.read_csv('Cleaned-Data.csv')

all_df['Severity'] = 0

Когда я добавляю столбец серьезности, он работает. Но когда я добавляю несколько logi c и l oop через набор данных, я снова получаю сообщение об ошибке.

for dataset in all_df:
    dataset.loc[dataset['Severity_None'] == 1, 'Severity'] = 1
    dataset.loc[dataset['Severity_Moderate'] == 1, 'Severity'] = 3
    dataset.loc[dataset['Severity_Mild'] == 1, 'Severity'] = 2
    dataset.loc[dataset['Severity_Severe'] == 1, 'Severity'] = 4 

AttributeError                            Traceback (most recent call last)
<ipython-input-51-d5f5b9230b07> in <module>
      1 for dataset in all_df:
----> 2     dataset.loc[dataset['Severity_None'] == 1, 'Severity'] = 1
      3     dataset.loc[dataset['Severity_Moderate'] == 1, 'Severity'] = 3
      4     dataset.loc[dataset['Severity_Mild'] == 1, 'Severity'] = 2
      5     dataset.loc[dataset['Severity_Severe'] == 1, 'Severity'] = 4

AttributeError: 'str' object has no attribute 'loc'

результат первых 5 строк.

enter image description here Почему я получаю указанную выше ошибку?

Ответы [ 5 ]

0 голосов
/ 05 мая 2020

In you для l oop у вас есть

for dataset in all_df:

Это проходит через каждый столбец. Вам нужно l oop через каждую строку, чтобы вы могли указать разные значения для Severity для разных строк. Ваш для l oop должен измениться на:

for dataset in all_df.index:

Попробуйте это. Если вы можете опубликовать несколько строк своего DataFrame, это поможет нам понять больше.

0 голосов
/ 05 мая 2020
for dataset in all_df:

Эта строка проходит через все заголовки DataFrame.

Чтобы создать новый столбец с именем «Severity», просто удалите for l oop и просто выполните

all_df["Severity"] = 1

Это добавляет 1 к каждой строке под столбцом Серьезность для вас.

0 голосов
/ 05 мая 2020

Чтобы добавить столбец в df, вам просто нужно присвоить значение. По умолчанию этому столбцу будет назначен ser ie со значением, которое вы присвоили, повторяется количество раз, превышающее длину ваших строк. Если вы хотите назначить значение для определенной строки и столбца c, вы используете ilo c или lo c, но если это совершенно новый столбец, вы назначаете список или ser ie из одинаковая длина строк или одно значение, которое будет повторяться. Примерно так

enter image description here

0 голосов
/ 05 мая 2020

Я думаю, вы упустили тот факт, что при использовании

for dataset in all_df:

он перебирает все имена столбцов набора данных Cleaned-Data.csv, хранящиеся в all_df, а не в наборе данных. И эти имена являются объектами str, т.е. строковыми объектами. Следовательно, вы столкнулись с ошибкой. Чтобы добавить новый столбец, вы можете просто сделать

all_df['Severity']=1

после загрузки файла с помощью pd.read_csv ('Cleaned-Data.csv')

0 голосов
/ 05 мая 2020

При использовании pandas вам не нужно вводить l oop через каждую строку. Он делает это автоматически и эффективно.

Чтобы создать столбец Severity, вы можете получить индексы для столбцов с разной степенью серьезности, в которых он установлен, и присвоить значение строке.

import numpy as np
import pandas as pd
import random as rnd

all_df = pd.read_csv('Cleaned-Data.csv')

severity_none_index = all_df[all_df['Severity_None'] == 1].index
severity_moderate_index = all_df[all_df['Severity_Moderate'] == 1].index
severity_mild_index = all_df[all_df['Severity_Mild'] == 1].index
severity_severe_index = all_df[all_df['Severity_Severe'] == 1].index

all_df.loc[severity_none_index]['Severity'] = 1
all_df.loc[severity_moderate_index]['Severity'] = 2
all_df.loc[severity_mild_index]['Severity'] = 3
all_df.loc[severity_severe_index]['Severity'] = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...