Как установить значение в панде DataFrame смешанным iloc и loc
Скажем, я хочу функцию, которая изменяет значение именованного столбца в заданном номере строки DataFrame.
Один из вариантов - найти местоположение столбца и использовать iloc, вот так:
def ChangeValue(df, rowNumber, fieldName, newValue):
columnNumber = df.columns.get_loc(fieldName)
df.iloc[rowNumber, columnNumber] = newValue
Но мне интересно, есть ли способ использовать магию iloc и loc за один раз и пропустить ручное преобразование.
Есть идеи?
5 ответов
Я предлагаю просто использовать iloc
в сочетании с Index.get_loc
метод. например:
df.iloc[0:10, df.columns.get_loc('column_name')]
Немного неуклюже, но достаточно просто.
MultiIndex
имеет оба get_loc
а также get_locs
который принимает последовательность; к несчастью Index
просто, кажется, первый.
С использованием
Приходится прибегать либо к целочисленному расположению
iloc
полностью - как предлагается в этом ответе - или с использованием простого местоположения
loc
полностью, как показано здесь:
df.loc[df.index[[0, 7, 13]], 'column_name']
Согласно этому ответу,
ix
обычно пытается вести себя какloc
но возвращается к ведению себя какiloc
если метка отсутствует в индексе.
Так что вы должны особенно уметь использовать df.ix[rowNumber, fieldname]
в случае type(df.index) != type(rowNumber)
,
Ты можешь это сделать:
df.iloc[rowNumber].loc[fieldName] = newValue
пример
import pandas as pd
def ChangeValue(df, rowNumber, fieldName, newValue):
df.iloc[rowNumber].loc[fieldName] = newValue
df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]],
index=[4, 5, 6], columns=['A', 'B', 'C'])
print(df)
A B C
4 0 2 3
5 0 4 1
6 10 20 30
ChangeValue(df, 1, "B", 999)
print(df)
A B C
4 0 2 3
5 0 999 1
6 10 20 30
Но будьте осторожны, если newValue не того же типа, он не работает и не сработает.
ChangeValue(df, 1, "B", "Oops")
print(df)
A B C
4 0 2 3
5 0 999 1
6 10 20 30
Здесь есть полезная информация о работе с типами данных столбцов: Изменить тип столбца в пандах
Даже если это не относится к каждому случаю, я хотел бы добавить более простой вариант, если вы ищете верхние или нижние записи:
df.head(1)['column_name'] # first entry in 'column_name'
df.tail(5)['column_name'] # last 5 entries in 'column_name'