2017-10-06 9 views
1

上の条件私は、次の頭を持つ大規模なデータフレームを持っているフィルターパンダのデータフレームの特定の月の値に基づいて、別の列

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

ヶ月間は10900までFamily_ids、0から239まで行き、家の値が異なります。したがって、データフレームには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']] 

もこれを試してみました10

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

これは、Seriesオブジェクトから要素を取得するための 'iloc'への高速の代替手段です。 'iat [0]'はシリーズの最初の要素を取得し、 'iat [-1]'は最後の要素を取得します。 – Psidom

+0

@Psidom OPの方法がうまくいかなかった理由を答えるために私のコメントを追加することができます – Dark

関連する問題