如何在执行某些操作时融化数据帧?

2024-05-12 20:13:12 发布

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

假设我有以下数据帧:

index    K1    K2    D1    D2    D3
N1       0     1     12    4     6
N2       1     1     10    2     7
N3       0     0     3     5     8

基本上,我想将此数据帧转换为以下内容:

index    COL1   COL2
K1       D1     = 0*12+1*10+0*3
K1       D2     = 0*4+1*2+0*5
K1       D3     = 0*6+1*7+0*8
K2       D1     = 1*12+1*10+0*3
K2       D2     = 1*4+1*2+0*5
K2       D3     = 1*6+1*7+0*8

COL2的内容基本上是index中的向量和COL1中的向量之间的点积(也称为标量积)。例如,让我们以结果df的第一行为例。在index下,我们有K1,在COL1下,我们有D1。查看第一个表,我们知道K1 = [0,1,0]D1 = [12,10,3]。这两个“向量”的标量积是COL2(第一行)内的值

我正试图找到一种不使用嵌套循环的方法来实现这一点(因为这样做的目的是使某些东西更高效),但是,我不知道如何实现。我试着使用pd.melt()函数,虽然它让我更接近我想要的,但它并不能让我达到我想要的地方。你能给我一个提示吗


Tags: 数据内容indexk2k1向量col2col1
2条回答

根据@QuangHoang的答案,您可以看到numpy.dot矩阵乘法版本是否有更高的性能。由于.to_numpy()只是创建了一个与KD索引无关的数字矩阵,因此除了纯数字之外,还必须进行一些操作,以使其恢复到所需的格式:

a1 = df[['D1','D2','D3']].T.to_numpy()
a2 = df[['K1','K2']].to_numpy()
df1 = pd.DataFrame(a1.dot(a2)).unstack().reset_index() #see other options below
df1['level_0'] = 'K' + (df1['level_0'] + 1).astype(str)
df1['level_1'] = 'D' + (df1['level_1'] + 1).astype(str)
df1
Out[1]: 
  level_0 level_1   0
0      K1      D1  10
1      K1      D2   2
2      K1      D3   7
3      K2      D1  22
4      K2      D2   6
5      K2      D3  13

其他numpy数组选项:

df1 = pd.DataFrame(a1 @ a2).unstack().reset_index()
df1 = pd.DataFrame(np.matmul(a1, a2)).unstack().reset_index()

更多信息(numpy matrix vector multiplication

这是矩阵乘法:

(df[['D1','D2','D3']].T@df[['K1','K2']]).unstack().reset_index()

输出:

  level_0 level_1   0
0      K1      D1  10
1      K1      D2   2
2      K1      D3   7
3      K2      D1  22
4      K2      D2   6
5      K2      D3  13

相关问题 更多 >