Python 将数据帧元素转换为元组

Python 将数据帧元素转换为元组,python,pandas,dataframe,tuples,Python,Pandas,Dataframe,Tuples,我有一个数据帧: >>> df = pd.DataFrame(np.random.random((3,3))) >>> df 0 1 2 0 0.732993 0.611314 0.485260 1 0.935140 0.153149 0.065653 2 0.392037 0.797568 0.662104 对于我来说,将每个条目转换为2元组最简单的方法是什么,第一个元素来自当前数据帧,

我有一个数据帧:

>>> df = pd.DataFrame(np.random.random((3,3)))
>>> df
          0         1         2
0  0.732993  0.611314  0.485260
1  0.935140  0.153149  0.065653
2  0.392037  0.797568  0.662104
对于我来说,将每个条目转换为2元组最简单的方法是什么,第一个元素来自当前数据帧,第二个元素来自最后一列(
'2'

i、 e.我希望最终结果是:

                      0                    1                      2
0  (0.732993, 0.485260)  (0.611314, 0.485260)  (0.485260, 0.485260)
1  (0.935140, 0.065653)  (0.153149, 0.065653)  (0.065653, 0.065653)
2  (0.392037, 0.662104)  (0.797568, 0.662104)  (0.662104, 0.662104)

从pd版本0.20开始,您可以使用
df.transform

In [111]: df
Out[111]: 
   0  1  2
0  1  3  4
1  2  4  5
2  3  5  6

In [112]: df.transform(lambda x: list(zip(x, df[2])))
Out[112]: 
        0       1       2
0  (1, 4)  (3, 4)  (4, 4)
1  (2, 5)  (4, 5)  (5, 5)
2  (3, 6)  (5, 6)  (6, 6)
或者,使用
df.apply的另一个解决方案:

In [113]: df.apply(lambda x: list(zip(x, df[2])))
Out[113]: 
        0       1       2
0  (1, 4)  (3, 4)  (4, 4)
1  (2, 5)  (4, 5)  (5, 5)
2  (3, 6)  (5, 6)  (6, 6) 
你也可以使用听写理解:

In [126]: pd.DataFrame({i : df[[i, 2]].apply(tuple, axis=1) for i in df.columns})
Out[126]: 
        0       1       2
0  (1, 4)  (3, 4)  (4, 4)
1  (2, 5)  (4, 5)  (5, 5)
2  (3, 6)  (5, 6)  (6, 6)

我同意Corley的意见,即最好将数据保留为当前格式,并将算法更改为显式处理第二列中的数据

但是,为了回答您的问题,您可以定义一个函数,该函数执行所需的操作,并使用apply调用它

我不喜欢这个答案,它很难看,“应用”是“for循环”的合成糖,你最好不要使用这个:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random((3,3)))




你为什么要这样做?更具体地说,如果您想以pandas本身不支持的格式保存数据,为什么要使用pandas?最好将数据保留为当前格式,并将算法更改为显式处理第二列中的数据例如,我想使用最后一列对所有其他列进行滚动回归。总之,这是不容易实现的(、和)。通过转换成元组,我有机会做到这一点。
df
          0         1         2
0  0.847380  0.897275  0.462872
1  0.161202  0.852504  0.951304
2  0.093574  0.503927  0.986476
def make_tuple(row):
    n= len(row)
    row = [(x,row[n - 1]) for x in row]
    return row

df.apply(make_tuple, axis =1)
0   (0.847379908309, 0.462871875315)  (0.897274903359, 0.462871875315)   
1   (0.161202442072, 0.951303842798)  (0.852504052133, 0.951303842798)   
2  (0.0935742441563, 0.986475692614)  (0.503927404884, 0.986475692614)   
                                  2  
0  (0.462871875315, 0.462871875315)  
1  (0.951303842798, 0.951303842798)  
2  (0.986475692614, 0.986475692614)