将索引替换为数据框中列表中的值

时间:2017-04-01 19:06:59

标签: python pandas numpy dataframe

我有以下数据框:

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]

对于每一行,我想使用A-D列中的数字作为列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将最后一列转换为矩阵,将前四列转换为另一个矩阵。但也坚持到那里!

2 个答案:

答案 0 :(得分:1)

以下是我将用2行代码完成的工作:

数据框:

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]

并根据需要转换回Dataframe:

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]  

答案 1 :(得分: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]会增加另一个维度。