Использование iloc для установки значений [закрыто]


13

Эта строка возвращает первые 4 строки в кадре данных combinedдляfeature_a

combined.iloc[0:4]["feature_a"]

Как и ожидалось, следующая строка возвращает 2-ю, 4-ю и 16-ю строки в кадре данных для столбца feature_a:

combined.iloc[[1,3,15]]["feature_a"]

Эта строка устанавливает первые 4 строки в dataframe для feature_aк 77.

combined.iloc[0:4]["feature_a"] = 77

Эта строка что-то делает. Некоторые виды вычислений происходят, так как это занимает больше времени применительно к более длинному списку.

combined.iloc[[1,3,15]]["feature_a"] = 88

2-я, 4-я и 16-я строки не устанавливаются на, 88если проверено с этим:

combined.iloc[[1,3,15]]["feature_a"]

Как я могу установить произвольный список строк столбца в кадре данных в значение, не принимая массивный обход кодирования?

Этот сценарий, кажется, должен быть довольно простым и распространенным.


Это вопрос только о программировании (без статистики), поэтому он относится к переполнению стека
Джейк Уэстфолл,

Без минимального воспроизводимого примера этот вопрос также был бы не по теме на
стеке потока

Ответы:


24

Если вы поменяете местами селекторы и выберите сначала по столбцу, все будет работать нормально:

Код:

df.feature_a.iloc[[1, 3, 15]] = 88

Почему?

Когда вы сделали первый (нерабочий путь), вы выбираете несмежный участок фрейма данных. Вы должны были получить предупреждение:

Значение пытается быть установлено для копии среза из DataFrame. Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = значение

См. Предупреждения в документации: http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

Это потому, что происходит две независимые операции.

  1. combined.iloc[[1,3,15]]создает новый фрейм данных только из трех строк, и фрейм обязательно копируется. тогда...
  2. выберите один столбец через, ["feature_a"]но он выбран против копии.

Таким образом, задание переходит к копии. Есть несколько способов исправить это, но в этом случае проще (и дешевле) сначала выбрать столбец, а затем выбрать части столбцов для назначения.

Тестовый код:

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

Результаты:

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0

1
Это может сработать, но почему?
Мэтью Друри
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.