【问题标题】:Selecting specific columns from multiple data-frame if the column name is same as the dataframe name如果列名与数据框名称相同,则从多个数据框中选择特定列
【发布时间】:2019-12-24 14:36:48
【问题描述】:

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

>> 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 个这样的不同维度的数据框。我正在寻找的是:

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

  2. 最后,将它们连接在一起作为一个数据框。

这里的问题是:对于某些数据帧,我的列名包含路径中的所有文件名,但对于少数数据帧,我只有包含文件名的列名和其他名称的附加列。所以我的以下代码是从每个数据帧中选择所有列。这不是我想要的。

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)

例如,在这种情况下,merged 数据帧由三个数据帧的所有列组成。然而,这不是我想要的。

最后,我需要我的数据框应该是这样的,

>> 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

非常感谢任何建议。 谢谢!

【问题讨论】:

    标签: python pandas dataframe multiple-columns


    【解决方案1】:

    用途:

    #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 step 抛出错误
    • 嗯,在真实的数据集中它仍然无法正常工作
    • df = df.mean(level=0),没有解决问题。我接受答案。非常感谢您的宝贵时间。
    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多