考虑我有一个如下数据框:
>>> 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
答案 0 :(得分:5)
您可以这样做:
In [576]: df.append(df.diff().dropna().abs())
Out[583]:
f1 f2
r1 1.0 2.0
r2 3.0 4.0
r2 2.0 2.0
答案 1 :(得分:3)
使用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)
答案 2 :(得分:2)
最简单的解决方案是使用带有行索引的.loc函数。
(已编辑,删除了与jezrael编写的代码相同的代码)
如果您不熟悉熊猫,我建议您检查一下DataFrame.apply函数,因为它允许对数据进行更广泛的操作(按行和按列)。解决方案如下:
df["r3"] = df.apply(lambda c: abs(c["r1"] - c["r2"]), axis=0)
pandas.DataFrame.apply是一个功能强大的工具,可让您将函数应用于数据集中的行或列,并利用pandas向量化的优势。