我有几个制表符分隔的文件,前两列相同。我正在尝试使用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)
答案 0 :(得分:0)
两个DataFrame的正确指令是:
pd.merge(df1, df2, how='outer')
(您必须同时通过 个合并的DataFrame)。
如果您有两个以上的此类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)
functools.reduce(...)
。此解决方案的优点(假设它有效)是 每个源DataFrame都在合并之前创建,然后 垃圾收集。
我通过以下方式确认了上述解决方案的有效性:
结果与DataFrame的“普通”列表相同。