【问题标题】:Merging DataFrames on dates in chronological order in Pandas在 Pandas 中按时间顺序合并日期上的 DataFrame
【发布时间】:2016-06-19 16:13:57
【问题描述】:

我在一个列表中有大约 50 个 DataFrame,它们具有这样的形式,其中每个 DataFrame 中包含的特定日期不一定相同。

>>> print(df1)

      Unnamed: 0             df1_name       
0     2004/04/27               2.2700
1     2004/04/28               2.2800
2     2004/04/29               2.2800
3     2004/04/30               2.2800
4     2004/05/04               2.2900
5     2004/05/05               2.3000
6     2004/05/06               2.3200
7     2004/05/07               2.3500
8     2004/05/10               2.3200
9     2004/05/11               2.3400
10    2004/05/12               2.3700

现在,我想将这 50 个 DataFrame 合并到日期列(每个 DataFrame 中未命名的第一列),并包括 any 中存在的所有日期数据帧。如果 DataFrame 没有该日期的值,它可以只是 NaN。

一个最小的例子

>>> print(sample1)
      Unnamed: 0             sample_1
0     2004/04/27                    1
1     2004/04/28                    2
2     2004/04/29                    3
3     2004/04/30                    4

>>> print(sample2)
      Unnamed: 0             sample_2
0     2004/04/28                    5
1     2004/04/29                    6
2     2004/05/01                    7
3     2004/05/03                    8

然后合并后

>>> print(merged_df)

          Unnamed: 0             sample_1        sample_2
    0     2004/04/27                    1             NaN
    1     2004/04/28                    2               5
    2     2004/04/29                    3               6
    3     2004/04/30                    4             NaN
    ....

有没有一种简单的方法可以利用 Pandas 的 mergejoin 函数来完成此任务?我在试图确定如何组合这样的日期时陷入了困境。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您只需在所有示例数据帧上使用pd.concat。但是你必须设置一些东西。一,将每个索引设置为要合并的列。确保该列是日期列。下面是一个如何做的例子。

    一个班轮

    pd.concat([s.set_index('Unnamed: 0') for s in [sample1, sample2]], axis=1).rename_axis('Unnamed: 0').reset_index()
    
       Unnamed: 0  sample_1  sample_2
    0  2004/04/27       1.0       NaN
    1  2004/04/28       2.0       5.0
    2  2004/04/29       3.0       6.0
    3  2004/04/30       4.0       NaN
    4  2004/05/01       NaN       7.0
    5  2004/05/03       NaN       8.0
    

    我觉得这样比较好理解

    sample1 = pd.DataFrame([
            ['2004/04/27', 1],
            ['2004/04/28', 2],
            ['2004/04/29', 3],
            ['2004/04/30', 4],
        ], columns=['Unnamed: 0', 'sample_1'])
    
    sample2 = pd.DataFrame([
            ['2004/04/28', 5],
            ['2004/04/29', 6],
            ['2004/05/01', 7],
            ['2004/05/03', 8],
        ], columns=['Unnamed: 0', 'sample_2'])
    
    list_of_samples = [sample1, sample2]
    
    for i, sample in enumerate(list_of_samples):
        s = list_of_samples[i].copy()
        cols = s.columns.tolist()
        cols[0] = 'Date'
        s.columns = cols
        s.Date = pd.to_datetime(s.Date)
        s.set_index('Date', inplace=True)
        list_of_samples[i] = s
    
    pd.concat(list_of_samples, axis=1)
    
                sample_1  sample_2
    Date                          
    2004-04-27       1.0       NaN
    2004-04-28       2.0       5.0
    2004-04-29       3.0       6.0
    2004-04-30       4.0       NaN
    2004-05-01       NaN       7.0
    2004-05-03       NaN       8.0
    

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2022-01-07
      • 2021-07-17
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多