Как установить значение в панде 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'
Другие вопросы по тегам