Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果列名与数据帧名称相同,则从多个数据帧中选择特定列_Python_Pandas_Dataframe_Multiple Columns - Fatal编程技术网

Python 如果列名与数据帧名称相同,则从多个数据帧中选择特定列

Python 如果列名与数据帧名称相同,则从多个数据帧中选择特定列,python,pandas,dataframe,multiple-columns,Python,Pandas,Dataframe,Multiple Columns,我有多个文件,我需要从每个数据帧中选择一个特定的列,并最终合并它们。 以下是我的数据框示例 >> df1.head() ID df1 fox mnd ADF 49.0 34.0 55.7 XCF 89.7 32.8 21.7 第二和第三数据帧是 >> df2.head() ID lat2 df2 sap ADF 67.00 84.00 95.70 XCF 59.70 62.80 1

我有多个文件,我需要从每个数据帧中选择一个特定的列,并最终合并它们。 以下是我的数据框示例

>> df1.head()

ID     df1    fox    mnd
ADF   49.0   34.0   55.7
XCF   89.7   32.8   21.7
第二和第三数据帧是

>> df2.head()

ID    lat2     df2     sap
ADF  67.00   84.00   95.70
XCF  59.70   62.80   11.70
BHG  89.00   54.89    0.34

>> df3.head()

ID     df1     df2     df3
ADF  56.00   84.00   95.70
XCF  59.70   62.80   11.70
CXD  89.90    0.90    1.56
以此类推,我有37个不同维度的数据帧。我要找的是:

  • 首先,我只需要选择与文件名相同的列。例如,从
    df1
    中,我只需要列
    df1

  • 最后,将它们作为单个数据帧连接在一起

  • 这里的问题是:对于某些数据帧,我的列名为,路径中包含所有文件名,但对于少数数据帧,我的列名仅包含文件名,其他列包含其他名称。下面的代码是从每个数据帧中选择所有列。这不是我要找的

    path = 'usr/fils/data'
    all_files = [os.path.join(path, i) for i in os.listdir(path) if i.endswith('tsv')]
    filenames = [os.path.basename(os.path.normpath(files)) for files in all_files]
    main = []
    
    for files in all_files:
        for samids in filenames:
            dfs = pd.DataFrame.from_csv(files, sep="\t")
            dfs.reset_index(drop=False, inplace=True)
            if samids in dfs.columns:
                pc_matrix = dfs[[samids]]
                main.append(pc_matrix)
    merged = pd.concat(main, axis=1)
    
    例如,在本例中,
    合并的
    数据帧由三个数据帧中的所有列组成。然而,这不是我想要的

    最后,我需要我的数据框

    >> df_final
    
    ID     df1     df2     df3
    ADF  49.00   84.00   95.70
    XCF  89.70   62.80   11.70
    BHG     NA   89.00      NA
    CXD     NA      NA    1.56
    
    任何建议都将不胜感激。 谢谢大家!

    使用:

    #https://www.dropbox.com/sh/mytlp1t6bro1yly/AAAofCoHrwZTtnn04NFYGSb1a?dl=0
    all_files = glob.glob('path/*')
    main = []
    for files in all_files:
        c = os.path.basename(os.path.normpath(files))
        try:
            df = pd.read_csv(files, usecols=[c] + ['ID'], index_col=['ID'], sep='\t')
            #if possible duplicated ID column - use mean or sum for unique values
            #df = df.mean(level=0)
            #df = df.sum(level=0)
            print (df)
            main.append(df)
        except:
            pass
    
    
    merged = pd.concat(main,axis=1, sort=True)
    print (merged)
          df1    df2    df3
    ADF  49.0  84.00  95.70
    BHG   NaN  54.89    NaN
    CXD   NaN    NaN   1.56
    XCF  89.7  62.80  11.70
    

    感谢您提供的快速解决方案,但是,您提供的解决方案有问题,我输入了不同行ID(行索引)的数据帧。因此,
    concat
    步骤抛出错误。另外,
    usecols
    也抛出了错误:``ValueError:usecols不匹配列,需要但未找到的列:['df1']``对不起,我已经编辑了我的问题,因为数据场在列名方面也是异构的。因此,
    usecol
    功能不会选择感兴趣的列,而是抛出一条错误消息。感谢您的解决方案,但它仍然返回空的
    df
    。因此concat steop抛出了errorhmm,在实际数据集中,它仍然不起作用。mean(level=0),无法解决问题。我接受答案。非常感谢您抽出时间。