根据特定月份值过滤pandas Dataframe,并以另一列为条件

时间:2017-10-06 13:45:50

标签: python pandas dataframe conditional-statements

我有一个包含以下头部的大型数据框

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任何想法。感谢。

1 个答案:

答案 0 :(得分: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评论的那样,你的方法出错了,因为对于布尔过滤器,它期望布尔系列具有与原始数据帧相同的长度,由于你应用的过滤器过程,在两种情况下都不是这样。在比较之前。