Використання 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 рядки в кадрі даних для 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"]

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

Цей сценарій здається, що він повинен бути досить простим і поширеним.


Це питання лише щодо програмування (немає статистики), і таким чином належить до Stack Overflow
Jake Westfall

Без мінімального відтворюваного прикладу подібне запитання також буде поза темою на
стаковому потоці

Відповіді:


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.