簡體   English   中英

刪除 pandas 數據幀的列值不連續出現的行

[英]Delete the rows with no continuous occurrence of a column values of a pandas data frame

我有一個這樣的數據框,

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

我想從上面創建一個具有以下條件的數據框,如果 col3 值不重復(col3 值的上面或底行不同)刪除該特定行,這里第 5 行只有 Q,第 9 行只有P 所以這些行應該被刪除。

所以最終的數據框應該是這樣的,

col1    col2    col3 
 1        A       P
 2        B       P
 3        C       P
 4        D       P
 6        F       T
 7        G       T
 8        H       T
 10       J       Q
 11       K       Q

我可以使用 for 循環並迭代下一行來執行此操作,但使用它執行時間會更長。 尋找一些 pandas 快捷方式/pythonic 方式來最有效地完成這項任務。

您可以將col3轉換為連續組,然后按Series.duplicated boolean indexing中的 Series.duplicated 創建的重復組進行過濾:

mask = df['col3'].ne(df['col3'].shift()).cumsum().duplicated(keep=False)

或者,如果想要 select 這里的計數可以使用GroupBy.transformGroupBy.size並比較像1

mask=df['col3'].groupby(df['col3'].ne(df['col3'].shift()).cumsum()).transform('size').gt(1)

Series.mapSeries.value_counts類似的解決方案:

s = df['col3'].ne(df['col3'].shift()).cumsum()
mask = s.map(s.value_counts()).gt(1)

df = df[mask]
print (df)
    col1 col2 col3
0      1    A    P
1      2    B    P
2      3    C    P
3      4    D    P
5      6    F    T
6      7    G    T
7      8    H    T
9     10    J    Q
10    11    K    Q

您可以嘗試使用 shift ,本質上您想排除兩側不是本身的值的東西,所以它的補充是:

df[(df['col3'] == df['col3'].shift(-1)) | (df['col3'] == df['col3'].shift(1))]

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

這將包括第一行和最后一行的單個值..不太確定你想如何處理這些......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM