[英]Pandas: Optimal subtract every nth row
我正在为 pandas 中的逐行减法的特殊情况编写 function。
例如,如果:
样品 | 变量1 | 变量1 |
---|---|---|
某物 | 10 | 20 |
某物 | 20 | 30 |
某物 | 40 | 30 |
some_BL20_thing | 100 | 100 |
某物 | 50 | 70 |
某物 | 90 | 100 |
some_BL10_thing | 100 | 10 |
预期的 output 应该是:
样品 | 变量1 | 变量1 |
---|---|---|
某物 | -90 | -80 |
某物 | -80 | -70 |
某物 | -60 | -70 |
某物 | -50 | 60 |
某物 | -10 | 90 |
我当前的(不完整的)实现很大程度上依赖于循环:
def subtract_blanks(data:pd.DataFrame, num_samples:int)->pd.DataFrame: ''' Accepts a data dataframe and a mod int and subtracts each blank from all mod preceding samples ''' expr = compile(r'(_BL[0-9]{1})') output = data.copy(deep = True) for idx,row in output.iterrows(): if search(expr,row['Sample']): for i in range(1,num_samples+1): output.iloc[idx-i,data_start:] = output.iloc[idx-i,6:]-row.iloc[6:] return output
有没有更好的方法来做到这一点? 这个实现看起来很丑陋。 我还考虑过可能将 DataFrame 拆分为卡盘并对其进行操作。
# Create boolean mask for matching rows # m = np.arange(len(df)) % 6 == 5 # for index match m = df['Samples'].str.contains(r'_BL\d+') # for regex match # mask the values and backfill to propagate the row # values corresponding to match in backward direction df['var1'] = df['var1'] - df['var1'].mask(~m).bfill() # Delete the matching rows df = df[~m].copy()
Samples var1 var1 0 something -90.0 -80.0 1 something -80.0 -70.0 2 something -60.0 -70.0 4 something -50.0 60.0 5 something -10.0 90.0
注意:核心逻辑在code
中指定,所以我将把 function 的实现留给 OP。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.