簡體   English   中英

遍歷多行數據幀並根據條件刪除行

[英]Iterate through multiple rows of dataframe and dropping rows based on condition

我有一個數據框:

  column1
19:08:22
ABCD
19:08:40
WXYZ
AAAA
19:09:02
XXXX
ZZZZ
19:09:49
ABCD

我只想在包含時間的行之后保留那些在連續兩行中具有文本值的行(這也是字符串)。

我正在尋找這個輸出:

  column1
19:08:40
WXYZ
AAAA
19:09:02
XXXX
ZZZZ

或者以更好的方式:

column1   text1  text2
19:08:40  WXYZ   AAAA
19:09:02  XXXX   ZZZZ

我不知道如何解決這個問題,

我想使用 .shift(2) 來比較行,但它不起作用。 還想過運行一個迭代循環,例如:

for index,rows in df.iterrows():
  current_row = rows
  ###Check for alternate row, if this contains time value remove them.

但這不是嘗試這個問題的正確方法。 任何幫助或指示表示贊賞。

嘗試:

grp = df['column1'].str.match('\d{2}:\d{2}:\d{2}').cumsum()
m = df.groupby(grp)['column1'].transform('count') > 2
df.loc[m]

輸出:

    column1
2  19:08:40
3      WXYZ
4      AAAA
5  19:09:02
6      XXXX
7      ZZZZ

細節:

  • 首先通過使用正則表達式來匹配“時間”的模式來創建組,然后使用 cumsum 將記錄分組或塊在一起。
  • 接下來使用 groupby 和 transform 來計算每組中的行數
  • 最后,根據每個組中的記錄數使用布爾索引過濾數據框。

更新更進一步:

df['grp'] = df['column1'].str.match('\d{2}:\d{2}:\d{2}').cumsum()
m = df.groupby('grp')['column1'].transform('count') > 2
df_out = df.loc[m].copy()
df_out['time'] = df_out['column1'].str.extract('(\d{2}:\d{2}:\d{2})').ffill()
df_out = df_out.query('column1 != time')
df_out.set_index(['time', df_out.groupby('time').cumcount()+1])['column1'].unstack().add_prefix('text')

輸出:

         text1 text2
time                
19:08:40  WXYZ  AAAA
19:09:02  XXXX  ZZZZ

您可以組合條件並重建數據幀,

cond1 = (df['column1'].str.contains('\d+')) & (df['column1'].shift(-1).str.contains('[A-Za-z]+')) & (df['column1'].shift(-2).str.contains('[A-Za-z]+')).fillna(False)

column1_idx = df[cond1].index
text1_idx = df[cond1].index+1
text2_idx = df[cond1].index+2

pd.DataFrame({'column1':df.iloc[column1_idx,0].reset_index(drop = True), 'text1':df.iloc[text1_idx,0].reset_index(drop = True),'text2':df.iloc[text2_idx,0].reset_index(drop = True)})
df[cond1]

    column1     text1   text2
0   19:08:40    WXYZ    AAAA
1   19:09:02    XXXX    ZZZZ

暫無
暫無

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

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