【问题标题】:Keep first and last rows of repetitive columns values of a panda data frame保留熊猫数据框的第一行和最后一行重复列值
【发布时间】:2020-05-19 11:09:30
【问题描述】:

我有一个这样的数据框,

df
col1    col2    col3 
 1        A       P
 2        B       P
 3        C       P
 4        D       P
 5        E       Q
 6        F       Q
 7        G       Q
 8        H       P
 9        I       P
 10       J       P
 11       K       P

我想从上面创建一个具有以下条件的新数据框, 如果 col3 值相同,则只保留第一行和最后一行重复的 col3 值。

所以最终的数据框看起来像,

df
col1    col2    col3 
 1        A       P
 4        D       P
 5        E       Q
 7        G       Q
 8        H       P
 11       K       P

我可以使用 for 循环并迭代下一行来执行此操作,但使用它执行时间会更长。寻找一些 pandas 快捷方式/pythonic 方式来最有效地完成这项任务。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们尝试shiftcusmum创建组,然后我们做duplicated

    s=df.col3.shift().ne(df.col3).cumsum()
    sdf=df[~(s.duplicated() & s.iloc[::-1].duplicated())].copy()
    sdf
    Out[219]: 
        col1 col2 col3
    0      1    A    P
    3      4    D    P
    4      5    E    Q
    6      7    G    Q
    7      8    H    P
    10    11    K    P
    

    【讨论】:

    • 不使用 groupby 是一个很好的答案。我考虑使用groupby.nth 的解决方案,但你的更好:) +1
    【解决方案2】:

    groupby 的nth 方法同样有效,正如@Andy.L 建议的那样:

    #get cumulative on col3
    df['col4'] = df.col3.ne(df.col3.shift()).cumsum()
    df.groupby('col4',sort=False).nth([0,-1])
    
             col1 col2 col3
    col4            
    1           1   A   P
    1           4   D   P
    2           5   E   Q
    2           7   G   Q
    3           8   H   P
    3           11  K   P
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多