可能之前已经问过了,买吧,找了30分钟也找不到.

我有两个相同列的Pandas 数据框.除了一列之外,其他值都匹配,我想执行一个完整的外连接,如果两个值都存在,则只获得一个值,如果其中一个存在,则只获得一个值.有许多匹配的列,因此我更喜欢不必 for each 匹配的列应用某些内容的解决方案.

示例 如果值在两个df中,则所有列都相同,只是频率不同:

  Gene  GeneID  Frequency
0   AA       1         10
1   BB       2         15
2   CC       3         12
  Gene  GeneID  Frequency
0   AA       1         20
1   DD       4         29

代码:

import pandas as pd


t1 = [{"Gene": "AA", "GeneID": "1" , "Frequency": 10},
{"Gene": "BB", "GeneID": "2" , "Frequency": 15},
{"Gene": "CC", "GeneID": "3" , "Frequency": 12}]


t2 = [{"Gene": "AA", "GeneID": "1" , "Frequency": 20},
{"Gene": "DD", "GeneID": "4" , "Frequency": 29}]

f1 = pd.DataFrame(t1)
f2 = pd.DataFrame(t2)

m = pd.merge(f1,f2,on=['Gene','Gene'],how='outer')

结果是:

  Gene GeneID_x  Frequency_x GeneID_y  Frequency_y
0   AA        1         10.0        1         20.0
1   BB        2         15.0      NaN          NaN
2   CC        3         12.0      NaN          NaN
3   DD      NaN          NaN        4         29.0

现在ID在genID_x或genID_y中.我想要以下内容:

  Gene GeneID  Frequency_x   Frequency_y
0   AA        1         10.0         20.0
1   BB        2         15.0          NaN
2   CC        3         12.0          NaN
3   DD        4         NaN          29.0

当然,我可以在需要的地方迭代和填充genID,但是还有更多匹配的列.肯定有更好的解决方案.我还try 了GROUP BY和Aggregate的Conat.这是可行的,但是如果只有一个值,我看不出频率来自第一个df还是第二个df.

谢谢.

推荐答案

您可以使用:

m = (pd.merge(f1, f2, on='Gene', how='outer')
       .rename(columns={'GeneID_x': 'GeneID'})
       .assign(GeneID=lambda x: x['GeneID'].fillna(x.pop('GeneID_y'))))

输出:

>>> m
  Gene GeneID  Frequency_x  Frequency_y
0   AA      1         10.0         20.0
1   BB      2         15.0          NaN
2   CC      3         12.0          NaN
3   DD      4          NaN         29.0

如果(Gene, GeneID)始终代表唯一的组合,则可以使用:

m = pd.merge(f1, f2, on=['Gene', 'GeneID'], how='outer')

Python相关问答推荐

使用itertools出现第n个子串

情节生成的饼图文本超出页面边界

如何才能将每个组比上一组增加N %?

customtkinter中使用的这个小部件的名称是什么

sys.modulesgo 哪儿了?

如果我已经使用了time,如何要求Python在12秒后执行另一个操作.sleep

机器人与Pyton Minecraft服务器状态不和

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

Python主进程和分支进程如何共享gc信息?

在matplotlib动画gif中更改配色方案

如果索引不存在,pandas系列将通过索引获取值,并填充值

在函数内部使用eval(),将函数的输入作为字符串的一部分

如何在msgraph.GraphServiceClient上进行身份验证?

运行终端命令时出现问题:pip start anonymous"

管道冻结和管道卸载

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

numpy.unique如何消除重复列?

python—telegraph—bot send_voice发送空文件

在代码执行后关闭ChromeDriver窗口

30个非DATETIME天内的累计金额