[英]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.transform
和GroupBy.size
並比較像1
:
mask=df['col3'].groupby(df['col3'].ne(df['col3'].shift()).cumsum()).transform('size').gt(1)
與Series.map
和Series.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.