将pandas dataframe元素转换为元组

时间:2017-07-24 15:03:53

标签: 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元组的最简单方法是什么,其中第一个元素来自当前数据帧,第二个元素来自最后一列('2')?

即。我希望最终结果是:

                      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)

2 个答案:

答案 0 :(得分:3)

从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) 

你也可以使用dict理解:

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)

答案 1 :(得分:0)

我同意Corley的评论,即最好将数据保留为当前格式,并将算法更改为从第二列明确处理数据。

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

我不喜欢这个答案,它很难看,“申请”是“For Loop”的合成糖,你最好不要使用它:

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


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)