2015-07-08 4 views
2

У меня есть Pandas DataFrame, который среди столбцов имеет номер, называемый Phone_Number. Я хочу получить только строки с номером телефона, который показывает 50 и более раз. Моя лучшая попытка была такой:Индекс Pandas DataFrame, принадлежащий к набору

counts = data.Phone_Number.value_counts() 
counts = counts[counts.values > 50] 
data[data.Phone_Number in counts.index] 

я, однако, эту ошибку: TypeError: объекты серии 'изменчивы, поэтому они не могут быть хэшированного

Что бы лучший способ, чтобы получить строки в кадр данных для этой ситуации?

спасибо!

+0

Используйте 'ISIN()': http://stackoverflow.com/questions/12065885/ how-to-filter-the-dataframe-rows-of-pandas-by-in-in/26724725 –

+0

Спасибо, @ajcr! Он не выдает ошибку, но я получаю пустой набор, который, как я думал, не был возможен (набор счетчиков не пуст и был сгенерирован из телефонных номеров, содержащихся в «данных») –

+0

Это странно, я бы подумал 'data [data.Phone_Number.isin (counts.index)]' будет работать. Можете ли вы разместить небольшой образец своих данных? –

ответ

0

Вы можете использовать groupby с filter.

import pandas as pd 
import numpy as np 

# generate some artificial data 
# =================================================== 
np.random.seed(0) 
# 450 rows/records in total 
df = pd.DataFrame(np.random.randint(1, 10, 450), columns=['Phone_Number']) 

Out[74]: 
Phone_Number 
0    6 
1    1 
2    4 
3    4 
4    8 
5    4 
6    6 
7    3 
..   ... 
442    7 
443    1 
444    9 
445    1 
446    8 
447    7 
448    6 
449    7 

[450 rows x 1 columns] 

# processing 
# =================================================== 

# filtered results: 177 rows 
df.groupby('Phone_Number').filter(lambda group: group.count() > 50) 

Out[75]: 
    Phone_Number 
2    4 
3    4 
5    4 
8    5 
11    9 
12    9 
17    9 
20    9 
..   ... 
424    5 
426    4 
428    5 
430    5 
431    5 
436    4 
441    4 
444    9 

[177 rows x 1 columns] 

# for reference: 71+54+52 = 177 
df.Phone_Number.value_counts() 

Out[76]: 
4 71 
9 54 
5 52 
1 50 
8 49 
3 45 
6 44 
2 43 
7 42 
dtype: int64 
+0

Спасибо, @ jianxun-li! –

0

Метод выше работает, чтобы решить вашу проблему. В целом же, если вы хотите, чтобы индексировать панда dataframe принадлежности к набору, вы можете использовать ISIN следующим образом:

counts = data.Phone_Number.value_counts() 
counts = counts[counts.values > 50] 
data[data.Phone_Number.isin(counts.index)] 
Смежные вопросы