如何在使用pandas的Python中满足某个条件后删除观察

时间:2017-03-13 11:31:10

标签: python pandas

我正在使用pandas数据帧,我想在满足条件(cond = 1)后删除具有相同名称的观察。

我的数据集如下:

    data

    Year amount
    2017 100
    2017 200
    2016 300
    2016 100
    2015 200
    2015 200
    2014 100
    2013 100

    expected result
    year amount
    2017 183.33
    2016 166.66
    2015 133.33
    2014 100 
    2013 100

我想得到这个:

person    cond
  A         0    
  A         0    
  A         1
  A         0
  A         0
  B         0 
  B         1
  C         1
  C         0

我希望代码首先检查下一个人是否具有相同的名称,然后检查是否满足条件(cond = 1),如果是,则删除所有具有相同名称的下一行。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

您可以使用groupbyapply lambda来执行此操作,该idxmax使用1从开始切割df直到第一个最大值,在这种情况下将是第一个In [16]: df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index() Out[16]: person level_1 cond 0 A 0 0 1 A 1 0 2 A 2 1 3 B 5 0 4 B 6 1 5 C 7 1 值:

drop

您还可以拨打'level_1'来删除In [23]: df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index().drop('level_1', axis=1) Out[23]: person cond 0 A 0 1 A 0 2 A 1 3 B 0 4 B 1 5 C 1 col:

1

<强>更新

要处理组中没有lambda的情况,我们可以测试In [24]: import pandas as pd import io # setup some data t="""person cond A 0 A 0 A 1 A 0 A 0 B 0 B 1 C 1 C 0 D 0 D 0""" df = pd.read_csv(io.StringIO(t), delim_whitespace=True) df Out[24]: person cond 0 A 0 1 A 0 2 A 1 3 A 0 4 A 0 5 B 0 6 B 1 7 C 1 8 C 0 9 D 0 10 D 0 In [29]: df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()] if len(x[x==0]) != len(x) else x) Out[29]: person A 0 0 1 0 2 1 B 5 0 6 1 C 7 1 D 9 0 10 0 Name: cond, dtype: int64 中的情况:

0

所以在这里我们测试所有值是否为SELECT t1.line_seg, t1.mgt_year, t1.[tot_dflt_mgt] , FIRST_VALUE(t1.tot_accum_mgt) OVER(PARTITION BY t1.[line_seg] ORDER BY t1.mgt_year DESC) - ISNULL(SUM(t2.[tot_dflt_mgt]) OVER(PARTITION BY t2.[line_seg] ORDER BY t2.mgt_year DESC), 0) AS tot_accum_mgt FROM [dbo].[t] AS t1 LEFT JOIN [dbo].[t] AS t2 ON (t2.line_seg = t1.line_seg AND t2.mgt_year = t1.mgt_year + 1) ORDER BY t1.line_seg, t1.mgt_year ASC; ,如果是,则返回组,否则我们像以前一样切片