当前位置: 首页 > 知识库问答 >
问题:

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

龙景澄
2023-03-14

我有两个形状相同的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个答案

强烨
2023-03-14

使用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]])
 类似资料:
  • 我有一个数据框,我正在使用TIA来填充彭博社的数据。当我看着df。索引我看到我打算成为列的数据以多索引的形式呈现给我。df的输出。列是这样的: 索引([u'column1','u'column2']) 我尝试过各种reset_index的迭代,但都无法补救这种情况。 1) TIA管理器如何使数据帧列作为索引读入? 2) 如何正确地将这些列标识为列而不是多索引? 我试图解决的最终问题是,当我尝试将此

  • 假设是一个数据帧。 只接受名字 只接受整数(实际放置) 接受名称和整数: 当引用行时,只希望获得名称。例如 抛出一个错误,它不会返回“2”。 当引用列时,iloc更喜欢整数,而不是名称。例如 返回“三”,而不是2。(尽管返回)。 奇怪的是,我喜欢完全相反的功能。通常我的列名非常有意义,所以在我的代码中我直接引用它们。但是由于大量的观察清理,我的熊猫数据帧中的行名称通常不对应于。 我意识到我可以使用

  • 我正在尝试从多索引数据帧中仅使用一个索引来创建新的数据帧。 理想情况下,我想要这样的东西: 和: 基本上,我想删除除level之外的多索引的所有其他索引。有没有一个简单的方法可以做到这一点?

  • 问题内容: 例如,假设一个简单的数据框 给定条件,如何检索行的索引值?例如: return ,但是我想得到的只是just 。这在以后的代码中给我带来麻烦。 基于某些条件,我想记录满足该条件的索引,然后在它们之间选择行。 我试过了 获得所需的输出 但我明白了 问题答案: 添加起来更容易-使用一个元素选择list的第一个值: 但是,如果某些值不匹配,则会出现错误,因为第一个值不存在。 解决方案是使用与

  • 我有一个多索引数据框(索引和)如下: 我想将转换为以下内容(其中索引转换为列,其中为值,保留为索引): 我一直在努力做到这一点,但还没走多远。

  • 目前,我有一个名为的,看起来像这样,其中几何体表示一个点(纬度、经度)。 给定另一个点(lat,long),我想找到从这个数据框到那个特定点的最近点。我用距离函数计算了最近的点 现在我有一个系列,看起来像这样 我怎样才能得到一个Geodataframe的副本,它按相同的顺序排序,如下所示?谢谢