【问题标题】:clean dataframe by columns condition按列条件清理数据框
【发布时间】:2018-03-20 17:16:29
【问题描述】:

我想只保留Dataframe 的行,条件如下:开始条件为col1 = 0, col2 = 1 的间隔(包括)和结束col1 = 0, col2 = 2 的间隔。

样本数据

import pandas as pd

pd.DataFrame({'id':['id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id2','id2','id2','id2','id2']
                  ,'col1':[0,1,1,0,1,0,0,1,1,0,0,1,0,0,1,1],'col2':[1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2]})

看起来像这样:

    col1 col2 id
0   0   1   id1
1   1   2   id1
2   1   2   id1
3   0   1   id1
4   1   2   id1
5   0   2   id1
6   0   1   id1
7   1   2   id1
8   1   2   id1
9   0   2   id1
10  0   1   id1
11  1   2   id2
12  0   2   id2
13  0   1   id2
14  1   2   id2
15  1   2   id2

输出样本

我们可以意识到col1,col2中只有带有0-1,0-2的“块”或间隔。

   col1 col2 id
3   0   1   id1
4   1   2   id1
5   0   2   id1
6   0   1   id1
7   1   2   id1
8   1   2   id1
9   0   2   id1
10  0   1   id1
11  1   2   id2
12  0   2   id2

结果行 0,1,2,13,14,15 被删除,因为它们不在 0-1 , 0-2 区间内。

【问题讨论】:

    标签: python pandas dataframe data-cleaning


    【解决方案1】:

    使用新的 para group(使用 df.drop('group',1) 删除它)


    设置

    df['group']=(df.col1==0)&(df.col2==1)
    df['group']=df['group'].cumsum()
    

    选项1

    mask=df.groupby('group').apply(lambda x : sum((x.col1==0)&(x.col2==2)))
    df.loc[df.group.isin(mask[mask.eq(1)].index)]
    
    
    Out[363]: 
        col1  col2   id  group
    3      0     1  id1      2
    4      1     2  id1      2
    5      0     2  id1      2
    6      0     1  id1      3
    7      1     2  id1      3
    8      1     2  id1      3
    9      0     2  id1      3
    10     0     1  id1      4
    11     1     2  id2      4
    12     0     2  id2      4
    

    选项2案例由
    提及 @Bharathshetty

    mask=df.groupby('group').last().loc[lambda x : (x.col1==0)&(x.col2==2),].index
    df.loc[df.group.isin(mask)]
    
    
    Out[379]: 
        col1  col2   id  group
    3      0     1  id1      2
    4      1     2  id1      2
    5      0     2  id1      2
    6      0     1  id1      3
    7      1     2  id1      3
    8      1     2  id1      3
    9      0     2  id1      3
    10     0     1  id1      4
    11     1     2  id2      4
    12     0     2  id2      4
    

    【讨论】:

    • 检查第三行是否为3 1 1 id1而不是0。如果组以(0,1)开头并以(0,2)结尾,则Op想要该组
    • @Bharathshetty 抱歉,我听不懂 .. 你能再解释一下吗?
    • 检查此数据df = pd.DataFrame({'id':['id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id1','id2','id2','id2','id2','id2'] ,'col1':[1,1,1,1,1,0,0,1,1,0,0,1,0,0,1,1],'col2':[1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2]})
    • @Bharathshetty 对于您提到的情况,我认为它将属于第一组而不是新组 2
    • 如果在某些 id 中缺少 (0,2) 怎么办?我的意思是按 (0,1- 0,2) 分组,但在 (0-2) 缺少分组的情况下,它也是为了将其保存在数据库中。即:数据样本中的行(0 ,1 ,2)。
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2022-10-13
    • 2020-01-04
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多