对列中的所有行对执行操作

2024-06-16 09:03:30 发布

您现在位置:Python中文网/ 问答频道 /正文

假设以下数据帧:

id    A   
1     0
2     10
3     200
4     3000

我想在所有行与所有其他行之间进行计算。
例如,如果计算是lambda r1, r2: abs(r1-r2),那么输出将是(以某种顺序)

id       col_name
1        10
2        200
3        3000
4        190
5        2990
6        2800

问题:

  1. 如何只获得上述输出?你知道吗
  2. 如何以最“熊猫般”的方式将结果与创造者联系起来?你知道吗

我希望尽可能地将所有内容都放在一个表中,以一种仍然支持合理查找的方式。你知道吗

我的数据规模不大,而且永远不会。你知道吗


编辑1:

回答我问题2的一个方法是

id       col_name    origin1    origin2
1        10          1          2
2        200         1          3
3        3000        1          4
4        190         2          3
5        2990        2          4
6        2800        3          4

我想知道这是否是标准的,是否有一种内在的方法,或者是否有另一种/更好的方法


Tags: 数据方法lambdanameid编辑内容顺序
2条回答

使用广播减法,然后np.tril_indices提取下对角线(正值)。你知道吗

# <= 0.23 
# u = df['A'].values
# 0.24+
u = df['A'].to_numpy()  
u2 = (u[:,None] - u)   

pd.Series(u2[np.tril_indices_from(u2, k=-1)])

0      10
1     200
2     190
3    3000
4    2990
5    2800
dtype: int64

或者,使用subtract.outer避免预先转换为数组。你知道吗

u2 = np.subtract.outer(*[df.A]*2)
pd.Series(u2[np.tril_indices_from(u2, k=-1)])

如果您也需要索引,请使用

idx = np.tril_indices_from(u2, k=-1)
pd.DataFrame({
    'val':u2[np.tril_indices_from(u2, k=-1)], 
    'row': idx[0], 
    'col': idx[1]
})

    val  row  col
0    10    1    0
1   200    2    0
2   190    2    1
3  3000    3    0
4  2990    3    1
5  2800    3    2

IIUCitertools

import itertools

s=list(itertools.combinations(df.index, 2)) 
pd.Series([df.A.loc[x[1]]-df.A.loc[x[0]] for x in s ])
Out[495]: 
0      10
1     200
2    3000
3     190
4    2990
5    2800
dtype: int64

更新

s=list(itertools.combinations(df.index, 2)) 

pd.DataFrame([x+(df.A.loc[x[1]]-df.A.loc[x[0]],) for x in s ])
Out[518]: 
   0  1     2
0  0  1    10
1  0  2   200
2  0  3  3000
3  1  2   190
4  1  3  2990
5  2  3  2800

相关问题 更多 >