如何自定义匹配大熊猫数据框?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何自定义匹配大熊猫数据框?相关的知识,希望对你有一定的参考价值。

我有两个大的pandas DataFrame df1(按paper排序):

reference                     paper
10.1103/PhysRevB.1.3614       10.1103/PhysRev.91.174
10.1103/PhysRev.92.1367       10.1103/PhysRev.91.174
10.1103/RevModPhys.62.251     10.1103/PhysRev.91.174
10.1103/PhysRevA.10.1494      10.1103/PhysRev.91.174
10.1103/PhysRevD.74.085005    10.1103/PhysRev.91.174
10.1103/PhysRevB.7.3541       10.1103/PhysRev.113.115
10.1103/PhysRevB.1.2088       10.1103/PhysRev.113.115
10.1103/PhysRevB.1.3614       10.1103/PhysRev.113.115
10.1103/RevModPhys.57.1055    10.1103/PhysRevLett.10.486
10.1103/PhysRevB.76.064524    10.1103/PhysRevLett.10.486
...

df2(自定义排序):

pair1                         pair2
10.1103/PhysRevA.30.336       10.1103/PhysRevA.34.1617
10.1103/PhysRevA.30.336       10.1103/PhysRevA.34.4472
10.1103/PhysRevA.30.336       10.1103/PhysRevA.41.784
10.1103/PhysRevA.34.4472      10.1103/PhysRevA.41.784   
10.1103/PhysRevA.36.4950      10.1103/PhysRevA.41.784   
10.1103/PhysRevA.38.3688      10.1103/PhysRevA.41.784   
10.1103/PhysRevA.41.3081      10.1103/PhysRevA.41.784   
10.1103/PhysRevA.30.336       10.1103/PhysRevA.45.5469  
10.1103/PhysRevA.34.4472      10.1103/PhysRevA.45.5469  
10.1103/PhysRev.91.174        10.1103/PhysRev.113.115
...

我想将两个数据框匹配为一个看起来像这样的单个数据框df

reference                     pair1                     pair2
10.1103/PhysRevB.1.3614       10.1103/PhysRev.91.174    10.1103/PhysRev.113.115
...

匹配条件为:

  1. reference中的[pair1df必须与reference中的paperdf1相对应。

  2. reference中的[pair2df必须与reference中的paperdf1相对应。

  3. pair1中的[pair2df必须与pair1中的pair2df2相对应。

因此,reference必须引用bothpair1 pair2作为paper中的df1,才能在df中注册为数据点。


我尝试将df1df2合并两次:

df = df1.merge(df2, left_on='paper', right_on='pair1', how='inner')
df = df.merge(df2, left_on='paper', right_on='pair2', how='inner')
df = df.drop(['paper'], axis=1)

但失败,因为这会产生不正确的数据点,例如reference仅引用了pair1中的pair2df1之一,但仍被注册在df中。 (更不用说由于过多的运行时间而使RAM崩溃)

我也曾尝试将DataFrames放入列表并匹配查询:

list1 = df1.values.tolist()
list2 = df2.values.tolist()

citlist = []
p1list = []
p2list = []

sublist = []
matches = []
citname = '10.1103/PhysRevB.1.3614'

for i in list1:
    # First data point
    if i[0] == citname:
        sublist.append(i[1])
    # For all data points
    if i[0] != citname:
        # Find matches
        for j in list2:
            if j[0] in sublist and j[1] in sublist:
                matches.append(j)
        for h in matches:
            citlist.append(citname)
            p1list.append(h[0])
            p2list.append(h[1])
        sublist = []
        matches = []
        citname = i[0]
        sublist.append(i[1])
    # Last data point
    if citname == '10.1103/PhysRevE.80.061802':
        for j in list2:
            if j[0] in sublist and j[1] in sublist:
                matches.append(j)
        for h in matches:
            citlist.append(citname)
            p1list.append(h[0])
            p2list.append(h[1])

但是后来我遇到了这样的问题,即在某种程度上,df1df2之间不会产生任何匹配的查询。 (此方法还需要21个小时才能运行)

关于此自定义匹配的任何见解?

答案

我认为您不需要两个DF,如果我正确理解了示例,所有数据都在DF1中:

df.set_index(["reference"]).unstack(level=0)

以上是关于如何自定义匹配大熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义函数应用于每行的熊猫数据框[重复]

如何按字符串索引上的自定义顺序对熊猫数据框进行排序

在 IPython 中使用自定义样式在函数内部显示熊猫数据框

如何根据熊猫数据框中的部分匹配来隔离重复项

如何使用比较多个数据框并使用熊猫返回匹配项

通过精确的单词匹配过滤熊猫数据框