我有两组数据,分为两列。 dataM具有与dataS匹配的一些点;如何找到它们匹配的行?

时间:2019-07-05 13:59:26

标签: python pandas dataframe indices

我有两组数据描述了一个分子的量子特性以及能量。 DataS有45k点,但没有不确定性,DataM有5k,但是每种能量都有不确定性。主要目标是将我们从DataM中获得的不确定性附加到更全面的DataS中。使用为方便起见被编译到单列中的其他量子特性,我如何才能将dataS中的数据与dataS中的数据进行匹配,以便我知道可以将不确定性附加到dataM中的哪一行/位置。我们基本上是在使用其他量子特性来识别正确的能量。我不想要1-1函数;它应该在M列中进行筛选,以找到S列中的哪一行匹配。

每一列的摘要:

                      S              M        ΔE
 0         0+X1Sigmag+0   0+X1Sigmag+0  0.000000
 1         0+X1Sigmag+1   2+X1Sigmag+0  0.008930
 2         0+X1Sigmag+2   4+X1Sigmag+0  0.002009
 3         0+X1Sigmag+3   6+X1Sigmag+0  0.001273
 4         0+b3Sigmag-0   8+X1Sigmag+0  0.005600
 5         0+X1Sigmag+4  10+X1Sigmag+0  0.001979
 6         0+b3Sigmag-1  12+X1Sigmag+0  0.001763
 7         0+X1Sigmag+5  14+X1Sigmag+0  0.001962
 8         0+b3Sigmag-2  16+X1Sigmag+0  0.006180
 9         0+X1Sigmag+6       2-a3Piu0  0.004950
 10        0+b3Sigmag-3       3-a3Piu0  0.005230

很明显,第一个匹配,所以我将第1行的不确定性附加为0(其Python为0)

 S = pd.DataFrame(data1, columns= ['Properties']).values
 M = pd.DataFrame(data2, columns= ['Properties']).values

我已组织成两个数据框,目前正在使用:

 equal_indices = []
 for i in range(len(S)): 
    for j in range(len(M)): 
        if S[i] == M[j] and M[i]==S[j]:
            equal_indices.append(j [have also tried i]) 
            print(i,j)

它花费的时间太长,没有任何用处...长度是一个问题,因为一旦我成功地管理了此数据,我将输入更大的数据值。

我想最终得到一个看起来像这样的代码(我组成的其他行,但第一行是正确的),但是对于许多匹配项:

ith row    matched property     resultant uncertainty 
0           0+X1Sigmag+0         0.000000
17          0+b3Sigmag-2         0.060789
450         2-a3Piu              0.005230

非常感谢您!

2 个答案:

答案 0 :(得分:0)

        if S[i] == M[j] and M[i]==S[j]:

如果S和M的长度不同,那么用i索引M以及用j索引S显然是错误的。

        if S[i] == M[j]:

试试看;如果结果正确,但速度太慢,我们可以开始进行优化。

  

如何在整个columnS数据集上附加第三列(与那些j值相对应)

为了连接两组数据,我们可以忘记上面的循环并使用(正如krewsayder所建议的那样)DataFrame.merge

data = data1.merge(data2, 'left', 'Properties')

合并类型'left'保留了更全面 data1集的键顺序,您不想对其进行重新排序。

答案 1 :(得分:0)

首先,欢迎堆栈溢出。

您可以合并列中的两个数据框,以得到完全匹配,前提是您想要的结果为DataS = DataM?

这将返回数据,就像您在SQL中进行了内部联接一样,左/右键由left_on / right_on表示。

DataM.index.name = 'M RowNum'
DataS.index.name = 'S RowNum'
Matched = DataS.reset_index()\
               .merge(DataM.reset_index(), left_on = 'S', right_on = 'M', how = 'inner')

如果您要从任一索引中选择行索引,则可以添加一种方法来重置索引,例如附加到任一数据帧的DataS.reset_index()