我有一个数据帧:
column1
19:08:22
ABCD
19:08:40
WXYZ
AAAA
19:09:02
XXXX
ZZZZ
19:09:49
ABCD
我想只保留那些在包含时间的行(dtype的this也是字符串)后连续两行中具有文本值的行。
我正在寻找这个输出:
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
细节:
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