Почему «составление» Series не приводит к индексу «input» Series? - PullRequest
1 голос
/ 26 сентября 2019

Я ожидаю, что индексирование одной серии за другой приведет к появлению новой серии, индекс которой будет таким же, как индексирование серии.Однако вместо этого он является комбинацией индекса индексируемой и индексирующей серии.

Running

A = pandas.Series(range(3), index=list("ABC"))
B = pandas.Series(list("AABBCC"), index=list("XYZWVU"))

print(A[B])

дает

A    0
A    0
B    1
B    1
C    2
C    2
dtype: int64

Таким образом, индекс здесь имеет формуB.index, но значения A.index.

Вместо этого я бы ожидал, что индекс для A[B] будет идентичен B.index, как если бы он составлял два отображения.Почему это не так?Есть ли польза от текущей настройки (которая мне кажется бесполезной)?Есть ли «правильный» способ получить то, что я ищу?

Эта проблема усложняет некоторые операции.Например,

B[A[B] == 2]

будет интуитивно понятно, как выбрать записи B, значения которых дают 2 при поиске их в A. (Это полезно, если B - это DataFrame с некоторыми идентификаторами объектов в одном столбце имы хотим выбрать строки B на основе значения этого объекта, хранящегося во вторичной таблице.) Однако это приводит к исключению ValueError: cannot reindex from a duplicate axis.Это работает, если вы сбрасываете индекс:

B[(A[B] == 2).values]

Используете ли .values правильный способ сделать это или есть лучший способ?

1 Ответ

1 голос
/ 26 сентября 2019

На мой взгляд, индексация - это выбор соответствующих индексов.Так что на самом деле A[B] все равно должно иметь index в A.index.

Если вместо этого вы хотите отобразить значения, используйте map.И, кажется, тоже быстрее:

%timeit -n 1000 B.map(A)
# 196 µs ± 6.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -n 1000 A[B]
# 384 µs ± 5.54 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

И:

%timeit -n 1000 B[B.map(A).eq(2)]
# 624 µs ± 38.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -n 1000 B[A[B].eq(2).values]
#779 µs ± 7.51 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...