Как правильно получить доступ к DataFrame Pandas, созданному из набора данных xarray

У меня есть набор данных xarray, созданный и преобразованный в pandas, например:

arr = xr.Dataset(
    coords = {
        "test1": range(20000,60000+1,2500),
        "test2": range(10, 100+1),
        "test3": range(1,10+1),
        "count_at_1": 0,
        "count_at_5": 0,
        "count_at_10": 0,
    }
)

df = arr.to_dataframe()

Кадр данных выглядит так, и это именно то, что я хочу:

                   count_at_1  count_at_5  count_at_10
test1 test2 test3                                     
20000 10    1               0           0            0
            2               0           0            0
            3               0           0            0
            4               0           0            0
            5               0           0            0
...                       ...         ...          ...
60000 100   6               0           0            0
            7               0           0            0
            8               0           0            0
            9               0           0            0
            10              0           0            0

Однако когда я пытаюсь получить доступ к определенному значению внутри этого фрейма данных, это вызывает некоторые проблемы:

print(df["count_at_1"][50000][70][5]) # works fine, prints 0 as it should

df.loc["count_at_1"][50000][70][5] = 10 # does not work, KeyError: 'count_at_1'
df.at["count_at_1"][50000][70][5] = 10 # does not work, gives TypeError

Я также хотел бы распечатать все значения count_at_x для определенного test1, test2, test3. Должно выглядеть примерно так:

print(df[50000][70][5])
count_at_1  count_at_5  count_at_10
         0           0            0

Извините, код выхода 1? Операторы Python не имеют кодов выхода. Вы про сценарий? Вы должны получить сообщение об ошибке... Возможно, проверьте, не перенаправляете ли вы stderr.

wjandrea 10.07.2024 17:16

Как насчет использования .reset_index()? Затем вы можете использовать .query для фильтрации ваших данных, используя столбцы test1, test2, test3.

Vinícius Tomazoni 10.07.2024 17:19

Должно быть, это была странная ошибка pycharm, я перезапустил ее и действительно получил правильную ошибку. К вашему сведению, в конце моего запуска я получаю сообщение «Процесс завершен с кодом выхода x», где 0 означает отсутствие ошибок, а ненулевое значение означает, что произошла ошибка.

Caden 10.07.2024 17:22

@ViníciusTomazoni Зачем запрашивать, если можно просто проиндексировать?

wjandrea 10.07.2024 17:29

Пожалуйста, задавайте только один вопрос в каждом посте. Я удалил новый. В любом случае по этому поводу существует вопрос: Найдите строку, в которой значения для столбца максимальны в DataFrame pandas

wjandrea 10.07.2024 20:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас просто неправильный синтаксис индексации. .loc и .at индексируют строки, когда вы присваиваете им скаляр, а не столбцы. Вместо этого вы можете передать им кортеж (строка, столбец).

df.loc[(50000, 70, 5), "count_at_1"] = 11
df.at[(50000, 70, 5), "count_at_1"] = 12

Вы также должны использовать что-то подобное для печати значения:

print(df.loc[(50000, 70, 5), "count_at_1"])
print(df.at[(50000, 70, 5), "count_at_1"])

Чтобы получить все значения в этой строке, вы можете использовать либо:

>>> df.loc[(50000, 70, 5)]  # Single row = Series
count_at_1     12
count_at_5      0
count_at_10     0
Name: (50000, 70, 5), dtype: int64

>>> df.loc[[(50000, 70, 5)]]  # Selection of one row = df
                   count_at_1  count_at_5  count_at_10
test1 test2 test3                                     
50000 70    5              12           0            0

Я не очень хорошо знаком с xarray, но отчасти ваше замешательство может быть связано с тем фактом, что DataFrames Pandas по своей сути являются 2D, поэтому индексирование нескольких уровней на самом деле не имеет смысла.

Дополнительную информацию см. в руководстве пользователя Pandas:

Все работает отлично, именно то, что мне нужно! Я думаю, что эта страница документации — это то, чего мне не хватало. Прав ли я, полагая, что .at и .loc выполняют в этом контексте почти одну и ту же функцию?

Caden 10.07.2024 17:48

@Caden Если .loc используется на скаляре, он работает точно так же, как .at, насколько мне известно. Разница в том, что он может работать со скаляром или диапазоном.

wjandrea 10.07.2024 17:50

Не уверен, что мне разрешено спрашивать здесь, но есть ли у вас какие-либо предложения по улучшению постановки моего вопроса? Кажется, вы очень опытны.

Caden 10.07.2024 18:00

Другие вопросы по теме