Skip to main content
 首页 » 编程设计

python之有效地计算数据框中两行之间的差异

2025年05月04日10开发

假设我有一个数据框,如下所示:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame([[1, 2], [3, 4]], columns=['f1', 'f2'], index=['r1', 'r2']) 
>>> df 
    f1  f2 
r1   1   2 
r2   3   4 

我应该如何有效地计算行 r1 和 r2 之间的绝对差异,并创建另一行作为 r3 以保留结果。也就是说,结果将如下所示:

>>> for cn in df.columns: 
...     diff_dat.append(abs(df[cn]['r1'] - df[cn]['r2'])) 
...  
>>> diff_dat 
[2, 2] 
>>> df.append(pd.DataFrame([diff_dat], index=['r3'], columns=df.columns)) 
    f1  f2 
r1   1   2 
r2   3   4 
r3   2   2 

请您参考如下方法:

使用loc对于选择行,减去,得到 abs最后通过 setting with enlargement 添加新行:

df.loc['r3'] = (df.loc['r1'] - df.loc['r2']).abs() 
print (df) 
    f1  f2 
r1   1   2 
r2   3   4 
r3   2   2 

1000 列的性能:

np.random.seed(123) 
df = pd.DataFrame(np.random.randint(10, size=(2, 1000)), index=['r1', 'r2']).add_prefix('f')-5 
 
#Mayank Porwal solution 
In [40]: %timeit df.append(df.diff().dropna().abs()) 
1.51 ms ± 19.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
 
#jezrael solution 
In [41]: %timeit df.loc['r3'] = (df.loc['r1'] - df.loc['r2']).abs() 
663 µs ± 54.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
 
#NaT3z solution 
In [42]: %timeit df.loc["r3"] = df.apply(lambda c: abs(c["r1"] - c["r2"]), axis=0) 
967 µs ± 80.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

为了提高性能,可以使用 numpy:

In [49]: %timeit df.loc['r3'] = np.abs(df.loc['r1'].values - df.loc['r2'].values) 
414 µs ± 1.68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)