Я хочу установить столбец 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справа от выражения. Но, к счастью, он был открыт достаточно долго, чтобы получить именно то, что мне было нужно.