2017-10-06 27 views
1

我有以下的頭篩選基於特定的月份值和有條件一個大熊貓數據幀上的另一列

import pandas as pd 
f = pd.Dataframe(columns=['month', 'Family_id', 'house_value']) 

個月的大數據幀去從0到239,Family_ids高達10900和房屋價值會發生變化。所以數據幀有超過250萬行。

我想過濾數據框僅適用於最終房價和每個家庭的初始價格之間存在差異的數據框。

一些樣本數據是這樣的:

f = pd.DataFrame({'month': [0, 0, 0, 0, 0, 1, 1, 239, 239], 'family_id': [0, 1, 2, 3, 4, 0, 1, 0, 1], 'house_value': [10, 10, 5, 7, 8, 10, 11, 10, 11]}) 

,並從該樣本,所產生的數據幀將是:

g = pd.DataFrame({'month': [0, 1, 239], 'family_id': [1, 1, 1], 'house_value': [10, 11, 11]}) 

所以我想在這會是這樣的代碼:

ft = f[f.loc['month'==239, 'house_value'] > f.loc['month'==0, 'house_value']] 

也試過這樣:

g = f[f.house_value[f.month==239] > f.house_value[f.month==0] and f.family_id[f.month==239] == f.family_id[f.month==0]] 

而上面的代碼給出了錯誤Keyerror: FalseValueError任何想法。謝謝。

+0

''month'== 239'你正在比較字符串,這會導致'False',並且你正在'.loc'的幫助下在索引中搜索'False'。所以它會導致關鍵的錯誤。什麼是你需要完成的。你可以發佈數據 – Dark

+2

這兩個系列可能有不同的長度,所以你不能比較這種方式。所以發佈期望的輸出樣本數據作爲輸入 – Dark

回答

4

使用groupby.filter

(f.sort_values('month') 
    .groupby('family_id') 
    .filter(lambda g: g.house_value.iat[-1] != g.house_value.iat[0])) 

# family_id house_value month 
#1   1    10  0 
#6   1    11  1 
#8   1    11  239 

正如評論說@Bharath,你的方法錯誤,因爲布爾過濾器,它預計布爾系列具有相同的長度爲原始數據幀,這是由於您在比較之前應用了過濾器過程,因此在兩種情況下都不是這樣。

+0

謝謝。它運行良好。 '.iat'指的是什麼? –

+0

這是'iloc'的一個快速替代方法,用於從Series對象獲取元素。 'iat [0]'得到系列中的第一個元素,而'iat [-1]'得到最後一個元素。 – Psidom

+0

@Psidom你可以在我的評論添加回答說爲什麼OP的方法不起作用 – Dark

相關問題