在Pandas

时间:2016-06-19 16:13:57

标签: python pandas dataframe

我在列表中有大约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

现在,我想在日期列(每个DataFrame中未命名的第一列)中合并这些50个DataFrame,并包含 任何 中的所有日期DataFrames。如果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功能来实现这一目标?我试图确定如何组合这样的日期,我已经陷入了困境。

1 个答案:

答案 0 :(得分:3)

您需要做的只是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