如何自定义匹配大熊猫数据框?
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
...
匹配条件为:
reference
中的[pair1
和df
必须与reference
中的paper
和df1
相对应。reference
中的[pair2
和df
必须与reference
中的paper
和df1
相对应。pair1
中的[pair2
和df
必须与pair1
中的pair2
和df2
相对应。
因此,reference
必须引用bothpair1
和 pair2
作为paper
中的df1
,才能在df
中注册为数据点。
我尝试将df1
和df2
合并两次:
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
中的pair2
或df1
之一,但仍被注册在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])
但是后来我遇到了这样的问题,即在某种程度上,df1
和df2
之间不会产生任何匹配的查询。 (此方法还需要21个小时才能运行)
关于此自定义匹配的任何见解?
答案
我认为您不需要两个DF,如果我正确理解了示例,所有数据都在DF1中:
df.set_index(["reference"]).unstack(level=0)
以上是关于如何自定义匹配大熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章