【问题标题】:Convert pandas dataframe elements to tuple将 pandas 数据框元素转换为元组
【发布时间】:2017-07-24 15:03:52
【问题描述】:

我有一个数据框:

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

【问题讨论】:

  • 为什么要这样做?更具体地说,如果您想以熊猫本身不支持的格式保存数据,为什么要使用熊猫?您最好将数据保留为当前格式,并更改算法以显式处理第二列中的数据
  • 例如,我想使用最后一列对所有其他列进行滚动回归。 AFAIK,这不容易实现(herehereherehere)。通过转换为元组,我可以尝试一下。

标签: python pandas dataframe tuples


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    我不喜欢这个答案,它很丑,“应用”是“For循环”的语法糖,你最好不要使用这个:

    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)  
    

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 1970-01-01
      • 2012-04-03
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多