2017-03-08 30 views
2

我有一個名爲房屋的熊貓數據框。一列是houseID,我想獲得僅有1000個不同房屋的信息。有相同的houseID(行數或多或少)的行數超過1行。爲此,我不能只得到1000個第一行,我需要的是這樣的:如何選擇限制列數據幀的計數? PYTHON

SELECT * FROM houses WHERE COUNT(DISTINCT houseID) <= 1000 

減少例子(原始數據框用3種不同的houseID,我想在這個減少的例子2不同houseID):

from collections import OrderedDict 
import pandas as pd 
housesDict = OrderedDict([ ('houseID', ['1', '3', '1','2','2','1','3','1','1']), 
       ('Cost', [150, 200, 50,100,75,18,10,23,19])]) 
houses = pd.DataFrame.from_dict(housesDict) 
print(houses) 

如果我想不同的房屋的限制爲2,預計我的輸出是:

housesDict = OrderedDict([ ('houseID', ['1', '3', '1','1','3','1','1']), 
        ('Cost', [150, 200, 50,18,10,23,19])]) 
houses = pd.DataFrame.from_dict(sales) 
print(houses) 

我該怎麼辦呢?

編輯: 我有解決方案,感謝您的幫助:

a = list(df.drop_duplicates(subset=["houseID"]).iloc[:2]['houseID']) 
df[df['houseID'].isin(a)] 
+0

您的期望結果與您的問題描述不符,例如爲什麼2除外,因爲它也有2個與3相同的銷售?此外,你是否在'df.groupby('houseID')後。filter(lambda x:len(x)<= 2)'? – EdChum

+0

@EdChum我想要1000個不同的houseID的所有行。總而言之,在我的表中,我需要1000個不同的houseID,並且我希望在這1000個不同的原始數據框中包含所有行。houseID – zorro

回答

1

如果你想在不同的值,你可以簡單地使用drop_duplicates

df = df.drop_duplicates(subset=["houseID"]).iloc[:1000] 

如果要限制數量的重複,您可以使用groupby.transform('count')與布爾索引。

df.loc[df.groupby("houseID")["houseID"].transform('count') < 3].iloc[:1000] 

編輯:誤解了這個問題,你可以使用上面的索引值的功能。

# gets first 1000 unique id's 
unique_ids = df.drop_duplicates(subset=["houseID"]).iloc[:1000]["houseID"] 
# selects rows if their ID's are in unique_id dataframe 
df = df.loc[df["houseID"].isin(unique_ids)] 
+0

我需要1000個不同houseID的所有行。在我的例子中,我有3個不同的houseID,我只想要2個不同的houseID(就是一個例子,在我的原始數據集中,我有超過1M的不同houseID,我想要1000個不同houseID的所有行) – zorro

+0

@zorro 'drop_duplicates'它會給你1000行(如果存在)不同的houseID和他們的行(第一次看到)。 – umutto

+0

我想要類似於'SELECT * FROM房屋哪裏COUNT(DISTINCT houseID)<= 1000',正在安置數據框和houseID列:S – zorro

相關問題