python - 数据框中所有行之间的最大元素差异

标签 python pandas numpy

给出以下数据框:

      c1  c2  c3  c4
code
x      1   2   1   1
y      3   2   2   1
z      2   0   4   1

对于此数据帧中的任何行,我想计算此行与此数据帧的所有其他行之间的最大元素绝对差,并将其放入新的数据帧中:

       x   y   z
code
x      0   2   3
y      2   0   2
z      3   2   0

(当然,结果是一个主对角线 = 0 的三角矩阵,因此只需获得上三角或下三角一半就足够了)。

例如,行 x 和 y 之间的最大元素差异为 2(来自 c1 列:abs(3 - 1) = 2)。

到目前为止我得到了什么:

df = pd.DataFrame(data={'code': ['x','y','z'], 'c1': [1, 3, 2], 'c2': [2, 2, 0], 'c3': [1,2,4], 'c4': [1,1,1]})
df.set_index('code', inplace = True)

df1 = pd.DataFrame()

for row in df.iterrows():
   df1.append((df-row[1]).abs().max(1), ignore_index = True)

当交互运行时,这看起来已经接近我需要的了,但是新的 df1 之后仍然是空的:

>>> for row in df.iterrows(): df1.append((df-row[1]).abs().max(1),ignore_index=True)
...
     x    y    z
0  0.0  2.0  3.0
     x    y    z
0  2.0  0.0  2.0
     x    y    z
0  3.0  2.0  0.0
>>> df1
Empty DataFrame
Columns: []
Index: []

问题:

  1. 如何将结果放入新数据帧 df1(具有正确的索引 x、y、...)?
  2. 这只是一个mcve 。实际上,df 大约有 700 行。不确定 iterrows 是否那么好。我有一种感觉apply方法在这里会派上用场,但我无法弄清楚。那么有没有更惯用/类似 pandas 的方法来做到这一点,而无需显式迭代行?

最佳答案

您可以使用 NumPy 并将数组提供给 pd.DataFrame 构造函数。对于少量行(如您的数据),这应该是有效的。

A = df.values
res = pd.DataFrame(np.abs(A - A[:, None]).max(2),
                   index=df.index, columns=df.index.values)

print(res)

      x  y  z
code         
x     0  2  3
y     2  0  2
z     3  2  0

关于python - 数据框中所有行之间的最大元素差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292180/

相关文章:

python - 如何使用 Bokeh 创建饼图?

python - Opencv错误初始化完成

python - ZODB 与 Tornado

python - R的relevel()和 Pandas 线性回归中的因子变量

python - Pandas:删除具有相同 "rounded"值的重复行而不创建新列

Python-@property 与 func()

python - 按多列 pandas 中的值计数进行透视

python - Numpy 索引 - 关于奇怪行为/不一致的问题

python - 与 python 的随机集成

python - 使用长数组时 numpy unwrap 出现错误