我有一个包含以下头部的大型数据框
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: False
和ValueError
任何想法。感谢。
答案 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评论的那样,你的方法出错了,因为对于布尔过滤器,它期望布尔系列具有与原始数据帧相同的长度,由于你应用的过滤器过程,在两种情况下都不是这样。在比较之前。