根据以下内容我有一个非常大的DataFrame:
id amt date 1 0 2010-02-01 1 0 2012-05-12 1 0 2016-08-09 1 20 1970-01-01 2 0 2016-03-21 2 0 2017-11-10 2 0 2012-09-01 2 0 2016-04-15
我想要的是根据以下逻辑将每个id减少到一行:
我希望按照以下说明。
id amt date 1 20 1970-01-01 2 0 2017-11-10
我实际上已经通过按ID排序和分组然后获取last()来解决它。但是,当我尝试编写一个对每个单独的groupby对象进行操作的函数并应用上面第1点和第2点(if / else-style)中的逻辑时,我的问题出现了。有人可以帮我这个吗?
DataFrame的代码如下 - 请注意,数据很大,因此快速执行很有帮助。
非常感谢,
/ Swepab
Newtonsoft.Json.Linq.JObject j = new Newtonsoft.Json.Linq.JObject();
答案 0 :(得分:1)
我编写了一个自定义函数,您可以将其应用于各个组
def custom_fx(df):
if df.amt.sum() == 0:
max_date = df.date.max()
return df.loc[df.date==max_date,:]
elif df.amt.sum() != 0 :
return df[df.date.isin(["1970-01-01"])]
for groups,data in df.groupby("id"):
print(custom_fx(data))
输出:
amt date id
3 20 1970-01-01 1
amt date id
5 0 2017-11-10 2
答案 1 :(得分:1)
我个人认为我们不需要使用groupby
drop_duplicates
df.sort_values(['amt','date']).drop_duplicates('id',keep='last')
Out[1139]:
id amt date
5 2 0 2017-11-10
3 1 20 1970-01-01