合并多个文件时如何修复熊猫合并功能错误

时间:2019-08-01 15:35:51

标签: python pandas

我有几个制表符分隔的文件,前两列相同。我正在尝试使用pandas合并功能并排合并这些文件。

我使用glob和read_csv函数制作了所有文件的数据框。一切看起来都很好,直到这里。熊猫合并功能抛出错误如下。 pd concat工作正常,但这不是我想要的,因为它正在当前文件下面添加新文件。请帮助我。

  path = r'/data/tim/home/*' 
  file = glob.glob(path + "/sale.txt")
  df = (pd.read_csv(i,delimiter='\t') for i in files)

  #combine_df   = pd.concat(df, ignore_index=True)
  combine_df   = pd.merge(df,on=1,2,how=outer")

我的输入文件:

    table
    batch   date    code
       1    12/9    ghu
       3    12/19   gnu
       4    11/3    ghu

    table
    batch   date    quantity 
       1    12/9    20 
       3    12/19   54 
       4    11/3    37 

必需的输出:

    table
    batch   date    code  quantity
       1    12/9    ghu    20
       3    12/19   gnu    54
       4    11/3    ghu    37

我收到此错误。由于我已经将文件合并到单个数据帧中。我如何提供多个论点?

  Traceback (most recent call last):
  File "combine_Sales.py", line 21, in <module>
    combine_df   = pd.merge(df,on=1,how=outer")
  TypeError: merge() takes at least 2 arguments (2 given)

1 个答案:

答案 0 :(得分:0)

两个DataFrame的正确指令是:

pd.merge(df1, df2, how='outer')

(您必须同时通过 个合并的DataFrame)。

如果您有两个以上的此类DataFrame,则应该:

  • 获取其中的前2个,并像上面那样合并
  • 然后将结果和下一个源DataFrame合并 他们以同样的方式。

替代

如果您有一个DataFrames列表( dfList ),则可以执行简化操作, 使用 functools.reduce

combined_df = functools.reduce(
    lambda dfA, dfB: pd.merge(dfA, dfB, how='outer'),
    dfList[1:], dfList[0])

或更短:

combined_df = functools.reduce(
    lambda dfA, dfB: pd.merge(dfA, dfB, how='outer'), dfList)

how='outer'对于某些DataFrame具有“专用”行( 不会出现在所有其他DataFrame中)。

以及有关使用的变量名的提示: df 通常用于 单个数据框。请勿将其用于数据框的列表

编辑

由于我没有您的源文件,因此无法对其进行测试,但是请尝试:

    按照您的问题dFrames = (pd.read_csv(i, delimiter='\t') for i in files)
  • 创建 dfList 。实际上,它将是 generator 类型,而不是 list
  • 然后如前所述致电functools.reduce(...)

此解决方案的优点(假设它有效)是 每个源DataFrame都在合并之前创建,然后 垃圾收集。

我通过以下方式确认了上述解决方案的有效性:

  • 根据不同的源数据创建了 df1 df2 df3
  • 创建的 dfL =([df1,df2,df3]中的n为n)发电机类型)。
  • dfL 执行 functools.reduce(...)

结果与DataFrame的“普通”列表相同。