【问题标题】:How to select rows in pandas dataframe based on values in other columns and How to select one row for each distinct value in particular column如何根据其他列中的值选择熊猫数据框中的行以及如何为特定列中的每个不同值选择一行
【发布时间】:2018-03-19 23:34:02
【问题描述】:

我是 pandas 的新手,在根据其他列中的值从 DF 中选择值时遇到问题。 以下是我的数据框:

     C1     C2      C3              C4 
0    1234   1002    Operational     ABC
1    5678   2001    Closed          ABC
2    7896   1002    Operational     DEF
3    4321   4005    Closed          CDE
4    7781   4005    Operational     ABC

第一季度。我想在 C2 中选择 C3 值为“可操作”的重复值。 输出数据框应该是

C1      C2      C3              C4 
1234    1002    Operational     ABC
7896    1002    Operational     ABC

我试过 df[(df.duplicated(['C2'], keep=False)) & df['C3'] == 'Operational'] 但它选择索引为 0,2,4 的行.但我只想要索引为 0 和 2 的行作为输出。

第二季度。如何为 C4 中的每个不同值选择一行。 输出数据框应该是

    C1      C2      C3              C4  
    7896    1002    Operational     DEF
    4321    4005    Closed          CDE
    7781    4005    Operational     ABC

我可以就这两个自定义选择获得任何建议吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    第一个解决方案更容易过滤两次 - 首先只有Operational,然后是duplicates

    df1 = df[df['C3'] == 'Operational'] 
    df1 = df1[df1.duplicated(['C2'], keep=False)]
    print (df1)
         C1    C2           C3   C4
    0  1234  1002  Operational  ABC
    2  7896  1002  Operational  DEF
    

    什么相同,但可读性较差:

    m1 = df['C3'] == 'Operational'
    df1 = df[df[m1].duplicated(['C2'], keep=False) & m1]
    print (df1)
         C1    C2           C3   C4
    0  1234  1002  Operational  ABC
    2  7896  1002  Operational  DEF
    

    对于第二个问题,使用drop_duplicates 和参数keep='last' 获取C4 中重复项的最后一个值:

    df2 = df.drop_duplicates('C4', keep='last')
    print (df2)
         C1    C2           C3   C4
    2  7896  1002  Operational  DEF
    3  4321  4005       Closed  CDE
    4  7781  4005  Operational  ABC
    

    或者如果有必要只删除连续的重复:

    mask = df['C4'].ne(df['C4'].shift()).cumsum().duplicated(keep=False)
    df2 = df[~mask]
    print (df2)
         C1    C2           C3   C4
    2  7896  1002  Operational  DEF
    3  4321  4005       Closed  CDE
    4  7781  4005  Operational  ABC
    

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 2018-08-05
      • 1970-01-01
      • 2015-10-23
      相关资源
      最近更新 更多