Нахождение строки в Dataframe, когда dataframe является одновременно int или string? - PullRequest
0 голосов
/ 17 апреля 2019

незначительная проблема с моей головой. У меня есть датафрейм, подобный следующему:

Number      Title
12345678    A
34567890-S  B
11111111    C
22222222-L  D

Это читается из файла Excel с использованием pandas в python, затем индекс устанавливается в первый столбец:

db = db.set_index(['Number'])

Затем я ищу название на основе номера:

lookup = "12345678"
title = str(db.loc[lookup, 'Title'])

Однако ... Хотя что-либо с постфиксом "-Something" работает, что-либо без него не может найти местоположение (например, 12345678 не найдет ничего, 34567890-S найдет). Единственное, что мне кажется, это то, что я смотрю как строки или целые числа, но я попробовал несколько вещей (преобразование таблицы во все строки, изменение loc на iloc, ix и т. Д.), Но пока не повезло.

Есть идеи? Спасибо:)

ОБНОВЛЕНИЕ: Таким образом, попытка сделать это с нуля не приводит к тому же самому поведению (создание тестовой базы данных, по-видимому, просто устанавливает все как строки), однако импорт из CSV приводит к приведенному выше, и ...

Поиск "12345678" (как строка) не находит его, но 12345678 как int будет. Аналогично и для других. Таким образом, фрейм данных сопоставляет только чистые числа в индексе с целыми числами, а все остальное - со строками.

Кроме того, я не могу не искать постфикс, поскольку у меня есть несколько строк с различным постфиксом, например, 34567890-S, 34567890-L, 34567890-X.

Ответы [ 2 ]

4 голосов
/ 17 апреля 2019

Если вы хотите привести все записи к одному определенному типу, вы можете использовать pandas.Series.astype:

db["Number"] = df["Number"].astype(str)
db = db.set_index(['Number'])

lookup = "12345678"
title = db.loc[lookup, 'Title']

Интересно, что это на самом деле медленнее, чем использование pandas.Index.map:

x1 = [pd.Series(np.arange(n)) for n in np.logspace(1, 4, dtype=int)]
x2 = [pd.Index(np.arange(n)) for n in np.logspace(1, 4, dtype=int)]

def series_astype(x1):
    return x1.astype(str)

def index_map(x2):
    return x2.map(str)

enter image description here

0 голосов
/ 17 апреля 2019

Рассмотрим все индексы как строки, так как по крайней мере некоторые из них не являются числами. Если вы хотите найти конкретный элемент, который может иметь постфикс, вы можете сопоставить его, сравнив начало строк с .str.startswith:

lookup = db.index.str.startswith("34567890")
title = db.loc[lookup, "Title"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...