pandas 组合dataframe汇总

pandas concat, merge, join

  • pandas concat 参数解释

    pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
              keys=None, levels=None, names=None, verify_integrity=False,
              copy=True)
    
    数据初始化:
    df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                        index=[0, 1, 2, 3])
    
    
    df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                        'B': ['B4', 'B5', 'B6', 'B7'],
                        'C': ['C4', 'C5', 'C6', 'C7'],
                        'D': ['D4', 'D5', 'D6', 'D7']},
                         index=[4, 5, 6, 7])
    
    
    df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                        'B': ['B8', 'B9', 'B10', 'B11'],
                        'C': ['C8', 'C9', 'C10', 'C11'],
                        'D': ['D8', 'D9', 'D10', 'D11']},
                        index=[8, 9, 10, 11])
    
    frames = [df1, df2, df3]
    
    • objs:允许[Series, DataFrame, Panel, dict]的sequence数据类型数据, 比如[{},{},{}]。

    • axis: {0, 1, …} ,0代表纵向组合,1代表横向组合, 默认为0。

      >>> pd.concat(frames, axis=0)
            A    B    C    D
      0    A0   B0   C0   D0
      1    A1   B1   C1   D1
      2    A2   B2   C2   D2
      3    A3   B3   C3   D3
      4    A4   B4   C4   D4
      5    A5   B5   C5   D5
      6    A6   B6   C6   D6
      7    A7   B7   C7   D7
      8    A8   B8   C8   D8
      9    A9   B9   C9   D9
      10  A10  B10  C10  D10
      11  A11  B11  C11  D11
      
      >>> pd.concat(frames, axis=1)
            A    B    C    D    A    B    C    D    A    B    C    D
      0    A0   B0   C0   D0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
      1    A1   B1   C1   D1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
      2    A2   B2   C2   D2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
      3    A3   B3   C3   D3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
      4   NaN  NaN  NaN  NaN   A4   B4   C4   D4  NaN  NaN  NaN  NaN
      5   NaN  NaN  NaN  NaN   A5   B5   C5   D5  NaN  NaN  NaN  NaN
      6   NaN  NaN  NaN  NaN   A6   B6   C6   D6  NaN  NaN  NaN  NaN
      7   NaN  NaN  NaN  NaN   A7   B7   C7   D7  NaN  NaN  NaN  NaN
      8   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   A8   B8   C8   D8
      9   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   A9   B9   C9   D9
      10  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  A10  B10  C10  D10
      11  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  A11  B11  C11  D11
      
  • join={'outer', 'inner'} ,如何组合数据,outer代表并集,inner代表交集。默认为outer

    >>> pd.concat(frames, axis=1, join='outer')
          A    B    C    D    A    B    C    D    A    B    C    D
    0    A0   B0   C0   D0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    1    A1   B1   C1   D1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    2    A2   B2   C2   D2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    3    A3   B3   C3   D3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    4   NaN  NaN  NaN  NaN   A4   B4   C4   D4  NaN  NaN  NaN  NaN
    5   NaN  NaN  NaN  NaN   A5   B5   C5   D5  NaN  NaN  NaN  NaN
    6   NaN  NaN  NaN  NaN   A6   B6   C6   D6  NaN  NaN  NaN  NaN
    7   NaN  NaN  NaN  NaN   A7   B7   C7   D7  NaN  NaN  NaN  NaN
    8   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   A8   B8   C8   D8
    9   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   A9   B9   C9   D9
    10  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  A10  B10  C10  D10
    11  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  A11  B11  C11  D11
    
    >>> pd.concat(frames, axis=1, join='inner')
    Empty DataFrame
    Columns: [A, B, C, D, A, B, C, D, A, B, C, D]
    Index: []
    
  • ignore_index=False, 如果为true则重新设置index

    >>> df4 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
    ...                     'B': ['B8', 'B9', 'B10', 'B11'],
    ...                     'C': ['C8', 'C9', 'C10', 'C11'],
    ...                     'D': ['D8', 'D9', 'D10', 'D11']},
    ...                     index=[1, 2, 3, 4])
    >>> pd.concat([df1,df4], ignore_index=1)
         A    B    C    D
    0   A0   B0   C0   D0
    1   A1   B1   C1   D1
    2   A2   B2   C2   D2
    3   A3   B3   C3   D3
    4   A8   B8   C8   D8
    5   A9   B9   C9   D9
    6  A10  B10  C10  D10
    7  A11  B11  C11  D11
    
    >>> pd.concat([df1,df4], ignore_index=0)
         A    B    C    D
    0   A0   B0   C0   D0
    1   A1   B1   C1   D1
    2   A2   B2   C2   D2
    3   A3   B3   C3   D3
    1   A8   B8   C8   D8
    2   A9   B9   C9   D9
    3  A10  B10  C10  D10
    4  A11  B11  C11  D11
    
  • join_axes 生成后的目标索引, 会覆盖join={'outer', 'inner'}

    >>> pd.concat([df1, df4], axis=1, join_axes=[df4.index])
         A    B    C    D    A    B    C    D
    1   A1   B1   C1   D1   A8   B8   C8   D8
    2   A2   B2   C2   D2   A9   B9   C9   D9
    3   A3   B3   C3   D3  A10  B10  C10  D10
    4  NaN  NaN  NaN  NaN  A11  B11  C11  D11
    
    >>> pd.concat([df1, df4], axis=1, join_axes=[df1.index])
        A   B   C   D    A    B    C    D
    0  A0  B0  C0  D0  NaN  NaN  NaN  NaN
    1  A1  B1  C1  D1   A8   B8   C8   D8
    2  A2  B2  C2  D2   A9   B9   C9   D9
    3  A3  B3  C3  D3  A10  B10  C10  D10
    
  • keys设置多层多索引

    >>> pd.concat(frames, keys=['x', 'y', 'z'])
            A    B    C    D
    x 0    A0   B0   C0   D0
      1    A1   B1   C1   D1
      2    A2   B2   C2   D2
      3    A3   B3   C3   D3
    y 4    A4   B4   C4   D4
      5    A5   B5   C5   D5
      6    A6   B6   C6   D6
      7    A7   B7   C7   D7
    z 8    A8   B8   C8   D8
      9    A9   B9   C9   D9
      10  A10  B10  C10  D10
      11  A11  B11  C11  D11
    
  • level设置多层目录 # todo

  • name 为多层目录设置名字 # todo

  • verify_integrity = False 检查是否有重复目录, 默认为false,不检查。True的话,查出会报错

    >>> pd.concat(frames, axis=1,ignore_index=0, verify_integrity=False)
          A    B    C    D    A    B    C    D    A    B    C    D
    0    A0   B0   C0   D0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    1    A1   B1   C1   D1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    2    A2   B2   C2   D2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    3    A3   B3   C3   D3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    4   NaN  NaN  NaN  NaN   A4   B4   C4   D4  NaN  NaN  NaN  NaN
    5   NaN  NaN  NaN  NaN   A5   B5   C5   D5  NaN  NaN  NaN  NaN
    6   NaN  NaN  NaN  NaN   A6   B6   C6   D6  NaN  NaN  NaN  NaN
    7   NaN  NaN  NaN  NaN   A7   B7   C7   D7  NaN  NaN  NaN  NaN
    8   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   A8   B8   C8   D8
    9   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   A9   B9   C9   D9
    10  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  A10  B10  C10  D10
    11  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  A11  B11  C11  D11
    
    >>> pd.concat(frames, axis=1,ignore_index=0, verify_integrity=True)
    
    Traceback (most recent call last):
      File "", line 1, in 
      File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 225, in concat
        copy=copy, sort=sort)
      File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 378, in __init__
        self.new_axes = self._get_new_axes()
      File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 458, in _get_new_axes
        new_axes[self.axis] = self._get_concat_axis()
      File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 516, in _get_concat_axis
        self._maybe_check_integrity(concat_axis)
      File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 525, in _maybe_check_integrity
        '{overlap!s}'.format(overlap=overlap))
    ValueError: Indexes have overlapping values: Index(['A', 'B', 'C', 'D'], dtype='object')
    

1, 纵向组合

使用pd.concat

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])


df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                     index=[4, 5, 6, 7])


df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])


frames = [df1, df2, df3]

pd.concat(frames)
      A    B    C    D
0    A0   B0   C0   D0
1    A1   B1   C1   D1
2    A2   B2   C2   D2
3    A3   B3   C3   D3
4    A4   B4   C4   D4
5    A5   B5   C5   D5
6    A6   B6   C6   D6
7    A7   B7   C7   D7
8    A8   B8   C8   D8
9    A9   B9   C9   D9
10  A10  B10  C10  D10
11  A11  B11  C11  D11

你可能感兴趣的:(pandas 组合dataframe汇总)