从行索引的数据帧中索引数据帧

时间:2019-03-21 19:09:03

标签: python pandas dataframe indexing

我有两个形状相同的python数据框,例如:

df1 = pd.DataFrame(np.random.randn(3,2), index=np.arange(3), columns=['a','b'] )
df2 = pd.DataFrame(np.random.randint(0, high=3, size=(3,2)), index=np.arange(3), columns=['a','b'] )

print df1
           a            b
0   0.336811    -2.132993
1  -1.492770     0.278024
2  -2.355762    -0.894376

print df2
           a            b
0          1            2
1          0            2
2          2            1

我想将df2中的值用作行索引,以选择df1中的值并创建形状相同的新数据框。 预期结果:

print df3
           a            b
0  -1.492770    -0.894376
1   0.336811    -0.894376
2  -2.355762     0.278024

我尝试使用.loc,它对于单列效果很好:

df3 = df1.loc[df2['a'], 'a']

print df3

0  -1.492770    
1   0.336811    
2  -2.355762    

但是我无法在所有列上同时使用.loc或.iloc。 由于要处理大型数据框,因此我想避免循环以优化性能。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用numpy选择

pd.DataFrame([df1[col].values[df2[col]] for col in df1.columns], index=['a','b']).T


    a           b
0   -1.492770   -0.894376
1    0.336811   -0.894376
2   -2.355762    0.278024

如果要避免for循环,则必须玩弄和拆散游戏。简而言之,您可以将所有数据帧压缩到一个向量中,在每个块处求和len(df1),以将索引跳转到下一列的开头,然后重新调整为原始大小。在这种情况下,所有操作都是矢量化的,因此应该很快。

例如,

df1.T.values.ravel()[df2.T.values.ravel() + np.repeat(np.arange(0, len(df1)+1, len(df1)), len(df1))].reshape(df1.T.shape).T

给予

array([[-1.49277 , -0.894376],
       [ 0.336811, -0.894376],
       [-2.355762,  0.278024]])