<p>其思想是通过<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.startswith.html" rel="nofollow noreferrer">^{<cd1>}</a>过滤值首先通过<a href="http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#boolean-indexing" rel="nofollow noreferrer">^{<cd2>}</a>过滤,通过<code>lambda function</code>处理行,然后排序,并在将<code>MDL</code>替换为<code>BNO</code>聚合值后使用<code>join</code>,最后使用<code>~</code>对反向掩码使用<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html" rel="nofollow noreferrer">^{<cd8>}</a>与原始过滤行不匹配条件:</p>
<p>此解决方案的优点是不更改不匹配的值,因此,如果重复项(如2次<code>STA</code>)且也未将<code>values</code>更改为字符串,则不会进行聚合</p>
<pre><code>df['datetime'] = pd.to_datetime(df['datetime'])
vals = ['BNO','MDL','SEQ']
mask = df['tagid'].str.startswith(tuple(vals))
df1 = df[mask].copy()
df1['value'] = df1['value'].apply(lambda x: chr(round(x / 256)) + chr(x % 256))
df1['tagid'] = df1['tagid'].str.split('_').str[0]
df1 = (df1.sort_values('tagid', ascending=False)
.replace({'MDL':'BNO'})
.groupby(['datetime','tagid'])['value']
.agg(''.join)
.reset_index())
df = pd.concat([df1, df[~mask]], ignore_index=True)
print (df)
datetime tagid value
0 2021-08-04 11:30:58 BNO SPW 211586
1 2021-08-04 11:30:58 SEQ 0456
2 2021-08-04 11:30:58 STA 724
3 2021-08-04 11:30:58 STO 735
</code></pre>