将多个if / else语句应用于pandas中的groupby对象

时间:2017-12-22 17:14:24

标签: python pandas group-by

根据以下内容我有一个非常大的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减少到一行:

  1. 对于给定的ID组:if amt> 0和日期== 1970-01-01然后输出行。
  2. 对于给定的ID组:如果所有id行都是amt == 0,则输出id的最大日期
  3. 我希望按照以下说明。

    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();
    

2 个答案:

答案 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