Python:熊猫合并多个数据框

新手上路,请多包涵

我有不同的数据框,需要根据日期列将它们合并在一起。如果我只有两个数据帧,我可以使用 df1.merge(df2, on='date') ,要使用三个数据帧,我使用 df1.merge(df2.merge(df3, on='date'), on='date') ,但是使用多个数据帧会变得非常复杂且不可读。

所有数据帧都有一个共同的列 - date ,但它们没有相同的行数或列数,我只需要每个日期对每个数据帧都通用的那些行。

所以,我正在尝试编写一个递归函数,它返回一个包含所有数据的数据帧,但它不起作用。那我应该如何合并多个数据框?

我尝试了不同的方法,得到了 out of rangekeyerror 0/1/2/3can not merge DataFrame with instance of type <class 'NoneType'> 之类的错误。

这是我写的脚本:

 dfs = [df1, df2, df3] # list of dataframes

def mergefiles(dfs, countfiles, i=0):
    if i == (countfiles - 2): # it gets to the second to last and merges it with the last
        return

    dfm = dfs[i].merge(mergefiles(dfs[i+1], countfiles, i=i+1), on='date')
    return dfm

print(mergefiles(dfs, len(dfs)))

一个例子:df_1:

 May 19, 2017;1,200.00;0.1%
May 18, 2017;1,100.00;0.1%
May 17, 2017;1,000.00;0.1%
May 15, 2017;1,901.00;0.1%

df_2:

 May 20, 2017;2,200.00;1000000;0.2%
May 18, 2017;2,100.00;1590000;0.2%
May 16, 2017;2,000.00;1230000;0.2%
May 15, 2017;2,902.00;1000000;0.2%

df_3:

 May 21, 2017;3,200.00;2000000;0.3%
May 17, 2017;3,100.00;2590000;0.3%
May 16, 2017;3,000.00;2230000;0.3%
May 15, 2017;3,903.00;2000000;0.3%

预期的合并结果:

 May 15, 2017;  1,901.00;0.1%;  2,902.00;1000000;0.2%;   3,903.00;2000000;0.3%

原文由 Vasco Ferreira 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 823
2 个回答

如果不涉及复杂查询,下面是合并多个数据帧的最干净、最易理解的方法。

只需简单地将 DATE 合并为索引并使用 OUTER 方法进行合并(以获取所有数据)。

 import pandas as pd
from functools import reduce

df1 = pd.read_table('file1.csv', sep=',')
df2 = pd.read_table('file2.csv', sep=',')
df3 = pd.read_table('file3.csv', sep=',')

现在,基本上将您拥有的所有文件作为数据框加载到列表中。然后,使用 mergereduce 函数合并文件。

 # compile the list of dataframes you want to merge
data_frames = [df1, df2, df3]

注意:您可以在上面的列表中添加尽可能多的数据框。 这是这种方法的优点。不涉及复杂的查询。

要保留属于同一日期的值,您需要将其合并到 DATE

 df_merged = reduce(lambda  left,right: pd.merge(left,right,on=['DATE'],
                                            how='outer'), data_frames)

# if you want to fill the values that don't exist in the lines of merged dataframe simply fill with required strings as

df_merged = reduce(lambda  left,right: pd.merge(left,right,on=['DATE'],
                                            how='outer'), data_frames).fillna('void')

  • 现在,输出将在同一行上显示同一日期的值。
  • 您可以使用 fillna() 为不同的列填充来自不同帧的不存在数据。

如果需要,然后将合并的数据写入 csv 文件。

 pd.DataFrame.to_csv(df_merged, 'merged.txt', sep=',', na_rep='.', index=False)

这应该给你

DATE VALUE1 VALUE2 VALUE3 ....

原文由 everestial007 发布,翻译遵循 CC BY-SA 4.0 许可协议

看起来数据具有相同的列,因此您可以:

 df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

merged_df = pd.concat([df1, df2])

原文由 Daniel Lopes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏