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

时间:2019-01-21 14:35:17

标签: 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方法在这里会派上用场,但我无法弄清楚。那么,在没有显式遍历行的情况下,还有其他惯用的/类似熊猫的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:0)

如果希望代码产生正确的输出,则可以再次将计算出的值分配给df1。

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

df1.index = df.index
print (df1)

     x    y    z
X  0.0  2.0  3.0
y  2.0  0.0  2.0
z  3.0  2.0  0.0