Python:pandas合并多个数据怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (539)

我有不同的数据文件,需要根据日期列将它们合并在一起。如果我只有两个文件,我可以用df1.merge(df2, on='date'),如果我尝试使用三个文件,我会使用df1.merge(df2.merge(df3, on='date'), on='date'),但是有多个文件要合并。

dataframes有一个共同的列-“Date”,但是没有相同数量的行或列,我只需要每个dataframe共有的日期。

因此,我试图编写一个递归函数,它返回一个包含所有数据的dataframe,但是它没有工作。 代码如下:

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)))

一个例子:文件_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;900.00;0.2%

档案_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;1,900.00;1000000;0.2%

档案_3:

May 21, 2017;3,200.00;2000000;0.2%
May 17, 2017;3,100.00;2590000;0.2%
May 16, 2017;3,000.00;2230000;0.2%
May 15,2017;2,900.00;2000000;0.2%

预期合并结果:

May 15,2017;2,900.00;2000000;0.2%  
提问于
用户回答回答于

下面是在不涉及复杂查询的情况下合并多个数据的方法。

只是简单地合并日期作为索引和合并使用方法(获取所有数据)。

    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')
  • 因此,同一日期的值在相同的行上。
  • 你可以使用addna()填充来自不同帧的不同列的非现有数据。

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

pd.DataFrame.to_csv(df_merged, 'merged.txt', sep=',', na_rep='.', index=False)
用户回答回答于

如果进行递归,这也将按预期运转:

def mergefiles(dfs=[], on=''):
    """Merge a list of files based on one column"""
    if len(dfs) == 1:
         return "List only have one element."

    elif len(dfs) == 2:
        df1 = dfs[0]
        df2 = dfs[1]
        df = df1.merge(df2, on=on)
        return df

    # Merge the first and second datafranes into new dataframe
    df1 = dfs[0]
    df2 = dfs[1]
    df = dfs[0].merge(dfs[1], on=on)

    # Create new list with merged dataframe
    dfl = []
    dfl.append(df)

    # Join lists
    dfl = dfl + dfs[2:] 
    dfm = mergefiles(dfl, on)
    return dfm

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励