【问题标题】:filtering my data based on three columns pandas根据三列熊猫过滤我的数据
【发布时间】:2020-11-28 01:01:44
【问题描述】:

所有,

我对如何做到这一点感到困惑。

假设我有下表(我提供了一个只有 1 个 id 的 sn-p,但我有很多 id)

      *id*         *status*                     *year*               
        2           active                         2018               
        2           active                         2019                  
        2           dissolved                      2019                
        2           dissolved                      2020 
        3           active                         2018               
        3           dissolved                      2019                  
        3           active                         2019                
        3           dissolved                      2020  

我想过滤它,如果 id 和 year 相同,则取 status = to溶解捐赠的行:

      *id*         *status*                     *year*               
        2           active                         2018                                
        2           dissolved                      2019                
        2           dissolved                      2020 
        3           active                         2018                               
        3           dissolved                      2019                
        3           dissolved                      2020  

我试过了:

 df.sort_values(['id','year']).drop_duplicates(subset=['id', 'year'],keep='last')

但有时公司会再次从解散状态变为活跃状态,因此当我真的希望该客户在同一年解散状态时,我会获得活跃状态。这就是为什么我想检测状态是否不同,如果是,请保留已溶解的状态。 IE。在哪里保持“最后”我怎么能基本上保持“溶解”状态。

我怎样才能做到这一点?

【问题讨论】:

  • 您的解决方案没有标准方法。你需要为这个问题编写自定义函数
  • 是的,但是如何,这就是我要问的
  • 刚刚发布了如何的回复

标签: python pandas filter duplicates


【解决方案1】:
import pandas as pd
x = pd.DataFrame([(1,"active",'1994'),(1,"dissolved",'1994'),(1,"active",'1995'),(1,"dissolved",'1996'),(2,"active",'1996')],columns=('id','status','year'))
y=pd.DataFrame(columns =x.columns)

#it will remove all the dublicates
for a,b in x.groupby(["id","year"]):
    if(b["id"].count()>1):
        y =y.append(b[b["status"] =="a"],ignore_index =True)
    else:
        y=y.append(b,ignore_index =True)

#now you can do sorting
y.sort_values(["id","year"])

【讨论】:

    【解决方案2】:

    据我了解,您希望所有具有相同 ID、年份和状态的行 == 已解散。 试试这个:

    df[(df.id == df.year) & (df.status == 'dissolved')]
    

    【讨论】:

    • 这没有意义,因为你说 id = year?他们永远不会一样
    • 我的 id 是指公司 id,而不是行 id
    • 你在你的问题中提到的“id”列是公司id还是行id?。我发布的这个答案是将id列作为公司id,因为你提到了sceanrio-“过滤它,如果id和年份相同”
    猜你喜欢
    • 2021-12-01
    • 2020-05-05
    • 2014-12-27
    • 2020-08-08
    • 1970-01-01
    • 2016-08-31
    • 2019-12-09
    • 1970-01-01
    • 2020-08-16
    相关资源
    最近更新 更多