将数据框中的列进行配对差分,生成130万列的数据框。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将数据框中的列进行配对差分,生成130万列的数据框。相关的知识,希望对你有一定的参考价值。

我有一个1600列的数据框。

数据框架 df 看起来像是列名的位置 1, 3 , 2:

Row Labels  1   3   2
41730Type1  9   6   5
41730Type2  14  12  20
41731Type1  2   15  5
41731Type2  3   20  12
41732Type1  8   10  5
41732Type2  8   18  16

我需要创建以下数据框架 df2 用python的方式。

Row Labels  (1, 2)  (1, 3)  (2, 3)
41730Type1  -4      -3       1
41730Type2  6       -2       -8
41731Type1  3       13       10
41731Type2  9       17        8
41732Type1  -3      2         5
41732Type2  8       10        2

其中e. g. column (1, 2) 是由 df[2] - df[1]

栏目名称为 df2 的列头配对创建。df1 使每个名字的第二个元素大于第一个元素,如 (1, 2), (1, 3), (2, 3)

第二个挑战是pandas数据框架能不能支持130万列?

答案

我们可以做 combinations 的列,然后创建 dictconcat 还给

import itertools
l=itertools.combinations(df.columns,2)
d={'{0[0]}|{0[1]}'.format(x) : df[x[0]]-df[x[1]] for x in [*l]  }
newdf=pd.concat(d,axis=1)
            1|3  1|2  3|2
RowLabels                
41730Type1    3    4    1
41730Type2    2   -6   -8
41731Type1  -13   -3   10
41731Type2  -17   -9    8
41732Type1   -2    3    5
41732Type2  -10   -8    2
另一答案

迭代工具组合 似乎是显而易见的选择,和@YOBEN_S一样,使用numpy数组和字典的不同路线来解决。

from itertools import combinations
new_data = combinations(df.to_numpy().T,2)
new_cols = combinations(df.columns, 2)

result = {key : np.subtract(arr1,arr2)
          if key[0] > key[1]
          else np.subtract(arr2,arr1)
          for (arr1, arr2), key
          in zip(new_data,new_cols)}

outcome = pd.DataFrame.from_dict(result,orient='index').sort_index().T

outcome


    (1, 2)  (1, 3)  (3, 2)
0   -4       -3       1
1    6       -2      -8
2    3       13      10
3    9       17       8
4   -3       2        5
5    8      10        2

以上是关于将数据框中的列进行配对差分,生成130万列的数据框。的主要内容,如果未能解决你的问题,请参考以下文章

遍历熊猫数据框中的列

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回

熊猫数据框中的列的总和

将具有多个键的 Python 字典映射到具有多个匹配键的列的数据框中

我正在尝试在另一个数据框的列中查找数据框中的列的元素,但 index() 对我不起作用

将熊猫数据框中的列向上移动一位?