Pythonic способ установить значение столбца Panda Dataframe на основе значений индекса

Я хочу установить столбец Pandas DataFrame в True/False в зависимости от того, находится ли индекс для DataFrame в наборе.

Я могу сделать это следующим образом:

import io

table = """
A,1,2
B,1,3
C,4,5
D,9,1
E,10,4
F,8,3
G,9,0
"""

df = pd.read_csv(io.StringIO(table), header=None, index_col=0)

fM7_notes = set(['F', 'A', 'C', 'E'])

df['in_maj_7'] = False
df.loc[fM7_notes, 'in_maj_7'] = True

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

df['in_maj_7'] = df.index in fM7_notes

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

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-81-851b1efe0c36> in <module>()
----> 1 df['in_maj_7'] = df.index in fM7_notes

~/anaconda/lib/python3.6/site-packages/pandas/core/indexes/base.py in __hash__(self)
   2060 
   2061     def __hash__(self):
-> 2062         raise TypeError("unhashable type: %r" % type(self).__name__)
   2063 
   2064     def __setitem__(self, key, value):

TypeError: unhashable type: 'Index'

Есть ли более чистый способ?

Я не думаю, что упомянутые статьи точно соответствуют действительности - я знал об использовании Series.isin для различных операций и о правильной индексации с набором (или списком). Мне просто не приходило в голову использовать Index.isin справа от выражения. Но, к счастью, он был открыт достаточно долго, чтобы получить именно то, что мне было нужно.

sfjac 29.06.2019 23:54
Почему в 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
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

С функцией pandas.Index.isin():

In [31]: df['in_maj_7'] = df.index.isin(fM7_notes)

In [32]: df
Out[32]:
    1  2  in_maj_7
0
A   1  2      True
B   1  3     False
C   4  5      True
D   9  1     False
E  10  4      True
F   8  3      True
G   9  0     False

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