Обновить значения ячеек в кадре данных - PullRequest
0 голосов
/ 08 апреля 2019

Я разбираю данные по строкам, как я могу обновить значение ячейки фрейма данных в цикле (прочитать значение, разобрать его, записать в другой столбец n)

Я попробовал следующий код

data = pd.read_csv("MyNames.csv") 


data["title"] = ""
i = 0
for row in data.iterrows():

name = (HumanName(data.iat[i,1]))
print(name)
data.ix['title',i] = name["title"]
i = i + 1
data.to_csv('out.csv')

Я ожидал бы следующее

name = "Mr John Smith"
              | Title
Mr John Smith | Mr

Вся помощь приветствуется!

Редактировать: я понимаю, что мне не нужно повторять. Если бы я мог вызвать функцию для всех строк в столбце и вывести результаты в другой столбец, это было бы проще - как оператор обновления SQL. Спасибо

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Вы можете попробовать .apply

def name_parsing(name):
    "This function parses the name anyway you want"""
    return HumanName(name)['title']

# with .apply, the function will be applied to every item in the column
# the return will be a series. In this case, the series will be attributed to 'title' column
data['title'] = data['name'].apply(name_parsing)

Кроме того, другой вариант, который мы обсуждаем ниже, заключается в сохранении экземпляра HumanName в кадре данных, поэтому, если вам понадобится другая информация из него позже, вам не нужно создавать экземпляр и анализировать имя снова ( Работа с строками может быть очень медленной на больших фреймах данных).
Если это так, частью решения будет создание нового столбца. После этого из него вы получите атрибут ['title']:

# this line creates a HumanName instance column
data['HumanName'] = data['name'].apply(lambda x: HumanName(x))
# this lines gets the 'title' from the HumanName object and applies to a 'title' column
data['title'] = data['HumanName'].apply(lambda x: x['title'])
0 голосов
/ 08 апреля 2019

Предполагая, что HumanName - это функция или что-то еще, что принимает строку и возвращает необходимый вам dict. не может проверить этот код отсюда, но вы получаете суть

data['title'] = data['name'].apply(lambda name: HumanName(name)['title'])

РЕДАКТИРОВАТЬ Я использовал row[1] из-за вашего data.iat[i,1] этот индекс можетна самом деле должно быть 0 вместо 1 не уверен

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