2017-07-24 55 views
1

我有一個數據幀:轉換大熊貓據幀要素元組

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

你爲什麼要這麼做?更具體地說,爲什麼你要使用熊貓,如果你想保持數據的格式熊貓本身不支持?您最好將數據保留爲當前格式,並將算法更改爲從第二列明確處理數據。 –

+0

例如,我想使用最後一列對所有其他列進行滾動迴歸。 AFAIK,這是不容易實現的([這裏](https://stackoverflow.com/questions/44380068/pandas-rolling-regression-alternatives-to-looping),[here](https://stackoverflow.com/questions/21040766/python-pandas-rolling-apply-two-column-input-in-function),[here](https://stackoverflow.com/questions/19121854/using-rolling-apply-on-a-dataframe-對象)和[這裏](https://stackoverflow.com/questions/21025821/python-custom-function-using-rolling-apply-for-pandas))。通過轉換爲元組,我有一個鏡頭。 – Zhang18

回答

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) 

你也可以使用詞典理解:

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

我同意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)