У меня есть набор данных 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
Как насчет использования .reset_index()? Затем вы можете использовать .query для фильтрации ваших данных, используя столбцы test1, test2, test3.
Должно быть, это была странная ошибка pycharm, я перезапустил ее и действительно получил правильную ошибку. К вашему сведению, в конце моего запуска я получаю сообщение «Процесс завершен с кодом выхода x», где 0 означает отсутствие ошибок, а ненулевое значение означает, что произошла ошибка.
@ViníciusTomazoni Зачем запрашивать, если можно просто проиндексировать?
Пожалуйста, задавайте только один вопрос в каждом посте. Я удалил новый. В любом случае по этому поводу существует вопрос: Найдите строку, в которой значения для столбца максимальны в DataFrame pandas
У вас просто неправильный синтаксис индексации. .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 Если .loc
используется на скаляре, он работает точно так же, как .at
, насколько мне известно. Разница в том, что он может работать со скаляром или диапазоном.
Не уверен, что мне разрешено спрашивать здесь, но есть ли у вас какие-либо предложения по улучшению постановки моего вопроса? Кажется, вы очень опытны.
Извините, код выхода 1? Операторы Python не имеют кодов выхода. Вы про сценарий? Вы должны получить сообщение об ошибке... Возможно, проверьте, не перенаправляете ли вы stderr.