【问题标题】:Indexing a dataframe from a dataframe of row indexes从行索引的数据帧索引数据帧
【发布时间】:2019-08-12 17:38:04
【问题描述】:

我有两个形状相同的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。 由于我正在处理大型数据帧,因此我想避免循环以优化性能。 有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe indexing


    【解决方案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 循环,你必须玩 raveling 和 unraveling。简而言之,您将所有数据框展平在一个向量中,在每个块上求和 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]])
    

    【讨论】:

    • 非常好。我在想这里的某种功能。但这服务。 :)
    • 谢谢!我很想试试看这有多快:)
    • 不幸的是,ravel 的解决方案似乎不适用于不同于 (3,2) 的尺寸...我正在尝试找出解决方法:)
    • df1.T.values.ravel()[df2.T.values.ravel() + np.repeat(np.arange(0, (df1.shape[0]*(df1.shape[1]-1))+1, len(df1)), len(df1))].reshape(df1.T.shape).T 这似乎适用于任何形状。
    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多