Столбцы подмножества DataFrame Numpy Массив в Pandas - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь разделить данные в кадре данных pandas на основе значений, которые существуют в отдельном массиве. Ниже приведен пример того, что действительно работает, и иллюстрирует то, что я пытаюсь сделать:

import pandas as pd
import numpy as np
mysubset = np.array([1,2,3,4])
d = {'col1': [1, 2, 3, 4, 5, 6], 'col2': [3, 4, 1, 3, 5, 5]}
df = pd.DataFrame(data=d)
df[df['col1'].isin(mysubset)]

Используя этот рабочий код в качестве прототипа, я реализую (то, что я считаю ) тот же процесс с моими реальными данными, но он не работает. Мои реальные данные выглядят как

>>> tmp.head()
   ItemID                  P0
44  26785         0.276844507
61  26534  1.4108438640000001
71  14107  1.0652574239999999
86  26530  1.1059459039999999
93  18142         0.903011679

, а массив, который я хочу использовать для подмножества, -

>>> op_items
array([18692, 18694, 18696, 18706, 18711, 18714, 18716, 18722, 19332,
       19333, 26526, 26527, 26530, 26532, 26533, 26534, 26535, 26536,
       26538, 26541, 14107, 14110, 14120, 14149, 14165, 17984, 18004,
       18005, 18006, 18007, 18008, 18134, 18136, 18139, 18141, 18142,
       19081, 19084, 19086, 20789, 20794, 20796, 20800, 20802, 26784,
       26785, 26786, 26787], dtype=int64) 

Использование этого, как в приведенном выше примере игрушки, дает

>>> tmp[tmp['ItemID'].isin(op_items)]
Empty DataFrame
Columns: [ItemID, P0]
Index: []

Но ручной захват некоторых элементов из списка действительно работает:

>>> tmp[tmp['ItemID'].isin(['18692', '18696'])]
    ItemID           P0
236  18696  0.566035305
624  18692   0.60981902

Использование следующего подтверждает, что они имеют ту же форму, что и в примере с игрушкой

>>> type(op_items)
<class 'numpy.ndarray'>
>>> type(tmp['ItemID'])
<class 'pandas.core.series.Series'>

Итак, я Я не уверен, какую еще ошибку совершаю, и мог бы использовать указатель. Я понимаю, что в примере, где я жестко запрограммировал и схватил, я привел значения в список. Но в приведенном выше примере игрушки используется функция isin, где mysubset - это массив, похожий на op_items.

Спасибо. Мой вопрос отличается от этого тем, что я не беспокоюсь о дубликатах, подмножество pandas фрейм данных с соответствующим numpy массивом .

1 Ответ

1 голос
/ 26 мая 2020

Ваш op_items - это массив целых чисел, а ваш tmp['ItemID'] - строковый. Используйте:

tmp['ItemID'] = tmp['ItemID'].astype('Int64')

tmp[tmp['ItemID'].isin(op_items)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...