Python 按列减去元素(以熊猫为单位)

Python 按列减去元素(以熊猫为单位),python,pandas,Python,Pandas,我有以下数据帧: frame=pd.DataFrame({"col1":[1,5,9,4,7,3],"col2":[5,8,7,9,3,4],"col3":[3,4,2,7,9,1], "col4":[2,4,7,4,9,0],"col5":[3,4,5,2,1,1],"col6":[8,7,5,4,1,2]}) 它会产生以下输出: col1 col2 col3 col4 col5 col6 0 1 5 3

我有以下数据帧:

frame=pd.DataFrame({"col1":[1,5,9,4,7,3],"col2":[5,8,7,9,3,4],"col3":[3,4,2,7,9,1],
          "col4":[2,4,7,4,9,0],"col5":[3,4,5,2,1,1],"col6":[8,7,5,4,1,2]})
它会产生以下输出:

    col1    col2    col3    col4    col5    col6
0     1       5      3       2        3       8
1     5       8      4       4        4       7
2     9       7      2       7        5       5
3     4       9      7       4        2       4
4     7       3      9       9        1       1
5     3       4      1       0        1       2
我想创建一个新的数据框架,将col1和col2、col3和col4以及col5和col6区别开来

预期产出如下:

    col1-col2   col3-col4   col5-col6
0      -4           1           -5
1      -3           0           -3
2       2          -5            0
3      -5           3           -2
4       4           0            0
5      -1           1           -1
提前谢谢

df = pd.DataFrame(frame.apply(lambda x: [x['col1']-x['col2'],x['col3']-x['col4'],x['col5']-x['col6']],axis=1).tolist())
df.rename({0:'col1-col2',1:'col3-col4',2:'col4-col5'},axis=1)


如果许多列使用通用解决方案-选择“对列”和“取消对列”,请转换为numpy数组,并由contructor创建新的
DataFrame

#pandas 0.24+
arr = frame.iloc[:, ::2].to_numpy() - frame.iloc[:, 1::2].to_numpy()
#pandas below
#arr = frame.iloc[:, ::2].values - frame.iloc[:, 1::2].values

c = [f'{a}-{b}' for a, b in zip(frame.columns[::2], frame.columns[1::2])]
df = pd.DataFrame(arr, columns=c)
print (df)
   col1-col2  col3-col4  col5-col6
0         -4          1         -5
1         -3          0         -3
2          2         -5          0
3         -5          3         -2
4          4          0          0
5         -1          1         -1
如果性能很重要,请首先转换为numpy数组,存储为变量,然后索引:

#pandas 0.24+
arr = frame.to_numpy()
#pandas below
#arr = frame.values
c = [f'{a}-{b}' for a, b in zip(frame.columns[::2], frame.columns[1::2])]
df = pd.DataFrame(arr[:, ::2] - arr[:, 1::2], columns=c)

@yatu-ya,double.values vs only only only,应该很有趣,看看性能上的差异……是的,很有趣
。values
非常昂贵。有一个很好的改善(200us)。尼斯+1
#pandas 0.24+
arr = frame.to_numpy()
#pandas below
#arr = frame.values
c = [f'{a}-{b}' for a, b in zip(frame.columns[::2], frame.columns[1::2])]
df = pd.DataFrame(arr[:, ::2] - arr[:, 1::2], columns=c)
dfr = pd.DataFrame({'col1-col2': frame.col1 - frame.col2,
                    'col3-col4': frame.col3 - frame.col4,
                    'col5-col6': frame.col5 - frame.col6})