2017-04-01 84 views
2

我有以下的数据帧:替换值指数

A | B | C | D | ListVal 
--------------------------------- 
0 | 3 | 2 | 1 | [0.0,0.1,0.2,0.3] 
--------------------------------- 
2 | 1 | 0 | 3 | [0.5,0.6,0.7,0.8] 
--------------------------------- 
2 | 3 | 1 | 0 | [0.15,0.25,0.35,0.45] 

对于每一行,我想在列AD使用的数字作为索引,以在柱ListVal列表,并填写相应列中的值。因此,对于上面的数据帧,我想将其转换为:

A | B | C | D | ListVal 
----------------------------------------- 
0.0 | 0.3 | 0.2 | 0.1 | [0.0,0.1,0.2,0.3] 
----------------------------------------- 
0.7 | 0.6 | 0.5 | 0.8 | [0.5,0.6,0.7,0.8] 
----------------------------------------- 
0.35| 0.45| 0.25| 0.15| [0.15,0.25,0.35,0.45] 

请注意,每行的索引不重复。

我试图通过将最后一列转换为矩阵并将前四列转换为另一个矩阵来使用numpy。但也卡在那里!

+0

@beniev nope,只是重读它,并得到它! – kaveh

+0

我的回答对你有帮助吗?如果是的话,我会感谢你,如果你会接受它... –

+0

谢谢。我已经做了! – edmondawad

回答

1

这里是我会怎么做,在两行代码:

数据框:

df1=pd.DataFrame({'A':[0,2,2],'B':[3,1,3],'C':[2,0,1],'D':[1,3,0],'ListVal':[[0.0,0.1,0.2,0.3],[0.5,0.6,0.7,0.8],[0.15,0.25,0.35,0.45]]}) 

它转换成一个列表的列表:

df_vals=df1.values.tolist() 

,并使用以下列表理解:

desired=[[d[4][e] if i<4 else e for i,e in enumerate(d)]for d in df_vals] 

并重新转换为数据帧,如果你想:

df=pd.DataFrame(desired, columns=['A','B','C','D','ListVal']) 

输出:

print df 
     A  B  C  D     ListVal 
0 0.00 0.30 0.20 0.10  [0.0, 0.1, 0.2, 0.3] 
1 0.70 0.60 0.50 0.80  [0.5, 0.6, 0.7, 0.8] 
2 0.35 0.45 0.25 0.15 [0.15, 0.25, 0.35, 0.45] 
+0

谢谢。这对我很好! – edmondawad

0

既然你问一个numpy的解决方案:

import pandas as pd 
import numpy as np 

df=pd.DataFrame({'A':[0,2,2],'B':[3,1,3],'C':[2,0,1],'D':[1,3,0], 
        'listVal':[[0.0,0.1,0.2,0.3],[0.5,0.6,0.7,0.8],[0.15,0.25,0.35,0.45]]}) 

a = df[range(4)].values 
b = np.array(list(df["listVal"].values)) 
c = b[:,a].diagonal(0,0,1).T 

newdf = pd.DataFrame(c, columns=df.columns[:-1]) 
newdf["listVal"] = df["listVal"] 
print newdf 

记住,这将创建一个大的开销,因为索引b[:,a]增加了另一个维度。