代码之家  ›  专栏  ›  技术社区  ›  kilojoules

数据帧:按公共列合并文件

  •  1
  • kilojoules  · 技术社区  · 7 年前

    我有一个文件集合,其中有一些我想要加入的公共列。在我真正的问题中,有几个不同和相同的列。在这个玩具示例中,我有一套 a 文件和一组 b c 柱。

    $ for ii in $(ls *.dat) ; do echo " "; echo $ii ; cat $ii ; done
    
    a1.dat
    a,c
    4,8
    1,10
    2,3
    
    a2.dat
    a,c
    1,2
    3,4
    
    b1.dat
    b,c
    2,8
    2,10
    1,3
    
    b2.dat
    b,c
    .2,2
    .8,4
    

    $ cat s.py 
    import pandas as pd
    dat = pd.DataFrame()
    for ii in [1, 2]:
      for jj in ['a', 'b']:
         d = pd.read_csv('%s%i.dat' % (jj, ii))
         if ii == 1: dat = pd.concat([dat, d])
         else: dat = pd.merge(dat, d, how='outer')
    print(dat)
    
    $ Python s.py 
         a    b   c
    0  4.0  NaN   8
    1  1.0  NaN  10
    2  2.0  NaN   3
    3  NaN  2.0   8
    4  NaN  2.0  10
    5  NaN  1.0   3
    6  1.0  NaN   2
    7  3.0  NaN   4
    8  NaN  0.2   2
    9  NaN  0.8   4
    

    这不是我想要的输出。我不明白如何才能使这项工作做得更好。期望的输出是

         a    b   c
    0  4.0  2.0   8
    1  1.0  2.0  10
    2  2.0  1.0   3
    3  1.0  0.2   2
    4  3.0  0.8   4
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Matthias Ossadnik    7 年前

    有两个步骤:

    首先,将相同类型的所有文件连接到一个数据帧中:

    df = {}
    for k in ['a', 'b']:
        df[k] = pd.concat([
                pd.read_csv('%s%d.dat' % (k, i)) for i in [1, 2]
                ], axis=0)
    

    然后在共享列“c”上合并联接,

    result = df['a'].merge(df['b'], on='c')[['a', 'b', 'c']]
    
        2
  •  1
  •   2Obe    7 年前

    首先 A. 文件,然后在列c上合并它们,如:

    import numpy as np
    import pandas as pd
    a1 = pd.DataFrame({
                   'a':   [4,1,2],
                   'c': [8,10,3],
                   })
    
    
    a2 = pd.DataFrame({
                   'a':   [1,3],
                   'c': [2,4],
                   })
    
    b1 = pd.DataFrame({
                   'b':   [2,2,1],
                   'c': [8,10,3],
                   })
    
    b2 = pd.DataFrame({
                   'b':   [0.2,0.8],
                   'c': [2,4],
                   })
    
    
    concat_df_a = pd.concat([a1,a2])
    concat_df_b = pd.concat([b1,b2])
    
    print(concat_df_b.merge(concat_df_a,on='c')[['a','b','c']])
    
    
    
    
    a    b   c
    0  4  2.0   8
    1  1  2.0  10
    2  2  1.0   3
    3  1  0.2   2
    4  3  0.8   4