• Python pandas merge不能根据列名合并两个数据框(Key Error)?


    折腾

    数据分析用惯了R,感觉pandas用起来就有点反人类了。今天用python的pandas处理数据时两个数据框硬是合并不起来。

    我有两个数据框,列名是未知的,只能知道索引,以及哪两个索引是用做主键合并的。(别问我为啥列名未知,因为我是开发工具)。

    思路是这样的,找到主键列,重命名,再合并。

    df1.columns.values[args.marker1-1]="markerID"
    df2.columns.values[args.marker2-1]="markerID"
    pd.merge(df1,df2,on='markerID')
    

    但结果就是无论如何也合并不了。报错KeyError:'markerID'

    网上查了下是说不能直接用columns.values赋值,要分开。于是:

    colnames_df1 = df1.columns
    colnames_df1[args.marker1-1] = "markerID"
    df1.columns = colnames_df1
    colnames_df2 = df2.columns
    colnames_df2[args.marker1-1] = "markerID"
    df2.columns = colnames_df2
    pd.merge(df1,df2,on='markerID')
    

    实际上并没有什么区别。TypeError: Index does not support mutable operations

    把数据框的列名全部print出来,看起来是正常的,为什么就合并不了?

    用很粗暴的方法:

    pd.merge(df1,df2,left_index=True,right_index=True)
    

    对于大部分数据可以,但有些数据是不行的,而且不报错,结果是错的,有很大风险。

    解决方法

    最后在网上又查了一圈,终于找到了答案。

    原因:
    两个数据框的主键名看起来一样,实际上可能不同,因为可能含有空格。怎么来的?无解。

    解决方法就是去除列名中可能存在的空格。

    方法一:

    df1.columns = df1.columns.str.strip() 
    df2.columns=df2.columns.str.strip()
    

    方法二:
    在数据读入时去掉。

    pd.read_csv(file,sep='s*,s*') 
    # delimiter includes x*whitespace before and after
    

    对应到我的数据就是:

    df1.columns = df1.columns.str.strip()
    df2.columns = df2.columns.str.strip()
    mrkid = df1.columns.values[args.marker-1]
    df1.columns.values[args.marker-1]="markerID"
    mergesnp = pd.merge(df1,df2,on='markerID')
    mergesnp.columns.values[args.marker-1]=mrkid
    

    参考:https://stackoverflow.com/questions/47608112/python-pandas-merge-cant-find-column-name

  • 相关阅读:
    HDU 1051 Wooden Sticks (贪心)
    PHP中递归函数的一个常见逻辑问题
    【Android界面实现】使用Canvas对象实现“刮刮乐”效果
    vue2.0
    vuex3
    nodejs中require的路径是一个文件夹时发生了什么
    vue2
    vuex
    echarts
    node21---mongoose
  • 原文地址:https://www.cnblogs.com/jessepeng/p/14983956.html
Copyright © 2020-2023  润新知