给出以下数据框:
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: []
问题:
答案 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