Pandas列上具有重复值的外部联接

2024-09-27 23:27:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我关于堆栈溢出的第一个问题,如果我的问题不清楚,请告诉我如何帮助您。在

目标:使用Python和Pandas来外部连接(或合并)包含不同实验试验的数据集,其中每个试验的“x”轴非常相似,但有一些偏差。最重要的是,“x”轴增大,达到最大值,然后减小,通常与先前存在的“x”点重叠。在

问题:当我加入/合并“x”上的数据集时,“x”列被排序,这扰乱了收集数据的顺序,使其无法正确绘制。在

下面是一个小例子,说明我要做的事情:

不让我添加图片,因为我是新来的。下面是生成这些示例数据集的代码。在

数据集:

Example - Trial 1 Data

Example - Trial 2 Data

导入:

import numpy as np
import pandas as pd
import random as rand

代码:

^{pr2}$

尝试合并/加入:

WomboCombo  = Trial1.join(Trial2,how='outer',lsuffix=1,rsuffix=2, on='x')
WomboCombo2 = pd.merge(left=Trial1, right= Trial2, how = 'outer', left

尝试分成两部分,增加和减少部分(手动找到数据“x”开始减少的行号):

Trial1Inc = Trial1[0:8]
Trial2Inc = Trial2[0:7]

结果-合并效果很好,用“x”列连接messes,不确定原因:

Trial1Inc.merge(Trial2Inc,on='x',how='outer', suffixes=[1,2])

Incrementing section Merge Result

Trial1Inc.join(Trial2Inc,on='x',how='outer', lsuffix=1,rsuffix=2)

Incrementing section Join Result 希望我的例子是清楚的,试验1中的“x”列增加到5,然后又回到0。在试用版2中,我稍微改变了测试,因为我注意到我需要一个稍微高一点的“x”值的数据。试验2增加到7,然后迅速减小到0。在

我的最终目标是根据相应的x值绘制所有y值的平均值(试验之间有重叠)。在

如果有重叠,我可以添加误差线。Pandas对于我所要做的几乎是完美的,因为外部连接在没有重叠的地方添加了空值,并且能够在有重叠时水平地连接两个试验。在

现在剩下的就是弄清楚如何在“x”列上联接,但要保持其值先增大后减小的顺序。对我来说,首先增加“x”然后再减小“x”很重要,因为当查看“y”值时,似乎给定“x”处的初始“y”值似乎大于“x”减小时的“y”值(例如,在试验1中,当x=1,y=10000时,然而,在试验后期,当我们回到x=1,y=9000时,这一趋势很重要。当Pandas在合并之前对列进行排序时,没有出现一条清晰的曲线,显示“y”随着“x”的增加而减少,然后反过来,在数据连接的任何一点都会出现垂直向下的跳跃。在

我非常感谢您的任何帮助:

A)一个完美的解决方案,当“x”包含重复项时,让我加入“x”

B)一种有效的方法,将数据集分成增加“x”和“x”递减,这样我就可以分别合并每个试验的增加和减少部分,然后垂直合并它们。在

希望我能把我想解决的问题解释清楚。如果我能澄清什么,请告诉我

谢谢你的帮助!在


Tags: 数据importpandas排序顺序onas绘制
3条回答

一种可能的解决方案是为您的试验行指定id,然后在id上进行合并。被排序的x应该保持值不在。在

我认为@xyzjayne拆分数据帧的想法是个好主意。在

拆分Trial1和Trial2:

# index of max x value in Trial2
t2_max_index = Trial2.index[Trial2['x'] == Trial2['x'].max()].tolist()
# split Trial2 by max value
trial2_high = Trial2.loc[:t2_max_index[0]].set_index('x')
trial2_low = Trial2.loc[t2_max_index[0]+1:].set_index('x')

# index of max x value in Trial1
t1_max_index = Trial1.index[Trial1['x'] == Trial1['x'].max()].tolist()
# split Trial1 by max vlaue
trial1_high = Trial1.loc[:t1_max_index[0]].set_index('x')
trial1_low = Trial1.loc[t1_max_index[0]+1:].set_index('x')

拆分数据帧后,我们将higher连接在一起,lowers连接在一起:

^{pr2}$

我们现在将它们组合起来,以获得一个数据帧WomboCombo

WomboCombo = WomboCombo_high.append(WomboCombo_low)

输出:

^{4}$

这是我正在尝试的,但是它没有处理不同数量的数据点。我喜欢gym hh的答案,尽管我不清楚你想要两列y,z对。所以你可以结合他的想法和这段代码来得到你需要的。在

Trial1['index1'] = Trial1.index
Trial2['index1'] = Trial2.index
WomboCombo = Trial1.append(Trial2)
WomboCombo.sort_values(by=['index1'],inplace=True) 
WomboCombo

输出:

^{pr2}$

相关问题 更多 >

    热门问题