在Pandas / Python中使用不同的列长度合并数据

时间:2015-09-11 19:02:44

标签: python pandas

我有2个不同的CSV文件。两个文件都有标题。大多数列都是相同的。有时,它们会有所不同。

    File1.csv
    Name    Username    Alias1 
    Tom     Tomfoolery   TJZ
    Meryl   MsMeryl      Mer
    Timmy   Midsize      Yoda

    File2.csv
    Name    Username   Alias 1   Alias 2
    Bob     Firedbob   Fire      Gingy
    Tom     Tomfoolery  TJZ      Awww

   DesiredFile.csv
    Name    Username    Alias1   Alias 2
    Tom     Tomfoolery   TJZ     NA (or blank)
    Meryl   MsMeryl      Mer     NA (or blank)
    Timmy   Midsize      Yoda    NA (or blank)
    Bob     Firedbob     Fire    Gingy
    Tom     Tomfoolery   TJZ     Awww

所以基本上,我想要合并两个文件。我希望所有的行都能保持战略。我不想组合合并行。这很重要,因为有时我需要保留重复数据。

我想要合并2个文件,但标题/列有所不同。

如果BOTH文件中存在一列,我希望该行的数据属于该列(EX:name)

如果某个列存在于一个文件中,我希望该文件中该列的所有内容都保留,但其他的"行"在他们的文件中没有该列的NA,N / A,空白,等等。

大熊猫可以轻松做到吗?我已经尝试了几种不同的方式,但还没有发现任何神奇的东西。

1 个答案:

答案 0 :(得分:0)

您可以使用pd.concat。它连接DataFrames并使用NaN自动填充缺失值:

import numpy as np
import pandas as pd
try:
    # for Python2
    from cStringIO import StringIO 
except ImportError:
    # for Python3
    from io import StringIO


df1 = pd.read_table(StringIO('''
    Name    Username    Alias1 
    Tom     Tomfoolery   TJZ
    Meryl   MsMeryl      Mer
    Timmy   Midsize      Yoda'''), sep='\s+')

df2 = pd.read_table(StringIO('''
    Name    Username   Alias1   Alias2
    Bob     Firedbob   Fire      Gingy
    Tom     Tomfoolery  TJZ      Awww'''), sep='\s{2,}')

result = pd.concat([df1, df2], axis=0)
print(result)

产量

  Alias1 Alias2   Name    Username
0    TJZ    NaN    Tom  Tomfoolery
1    Mer    NaN  Meryl     MsMeryl
2   Yoda    NaN  Timmy     Midsize
0   Fire  Gingy    Bob    Firedbob
1    TJZ   Awww    Tom  Tomfoolery

请注意,列名显然对空格敏感 - Alias1Alias 1不同。因此,为了获得所需的结果,我必须修改File2.csv数据以删除Alias 1中的空格。