基于多个数据帧的通用时间戳创建一个数据帧

时间:2020-09-22 15:58:52

标签: python pandas dataframe

我正在寻找一种从多个数据帧中选择通用时间戳的优雅解决方案。我知道可以将通用时间戳记的数据帧设为df

df = df1[df1['Timestamp'].isin(df2['Timestamp'])] 

但是,如果我还有其他几个数据帧,则此解决方案将变得非常模糊。因此,我一直想知道在处理多个数据框时是否有更简单的方法来实现我的目标。

例如,假设我有:


date1 = pd.date_range(start='1/1/2018', end='1/02/2018', freq='H')
date2 = pd.date_range(start='1/1/2018', end='1/02/2018', freq='15min')
date3 = pd.date_range(start='1/1/2018', end='1/02/2018', freq='45min')
date4 = pd.date_range(start='1/1/2018', end='1/02/2018', freq='30min')

data1 = np.random.randn(len(date1))
data2 = np.random.randn(len(date2))
data3 = np.random.randn(len(date3))
data4 = np.random.randn(len(date4))

df1 = pd.DataFrame(data = {'date1' : date1, 'data1' : data1})
df2 = pd.DataFrame(data = {'date2' : date2, 'data2' : data2})
df3 = pd.DataFrame(data = {'date3' : date3, 'data3' : data3})
df4 = pd.DataFrame(data = {'date4' : date4, 'data4' : data4})

例如,我想要一个包含四个数据帧的公共时间戳以及每个数据列中各自数据列的数据帧作为输出(例如,为了说明我的意思,它不反映结果) ):

    commom Timestamp     data1    data2    data3    data4
0  2018-01-01 00:00:00 -1.129439   1.2312   1.11    -0.83
1  2018-01-01 01:00:00  0.853421   0.423    0.241   0.123
2  2018-01-01 02:00:00 -1.606047   1.001   -0.005   -0.12
3  2018-01-01 03:00:00 -0.668267   0.98     1.11    -0.23
[...]

2 个答案:

答案 0 :(得分:3)

您可以使用functools中的reduce来执行完整的内部合并。我们只需要重命名这些列,这样合并就容易了。

from functools import reduce

lst = [df1.rename(columns={'date1': 'Timestamp'}), df2.rename(columns={'date2': 'Timestamp'}), 
       df3.rename(columns={'date3': 'Timestamp'}), df4.rename(columns={'date4': 'Timestamp'})]

reduce(lambda l,r: l.merge(r, on='Timestamp'), lst)

            Timestamp     data1     data2     data3     data4
0 2018-01-01 00:00:00 -0.971201 -0.978107  1.163339  0.048824
1 2018-01-01 03:00:00 -1.063810  0.125318 -0.818835 -0.777500
2 2018-01-01 06:00:00  0.862549 -0.671529  1.902272  0.011490
3 2018-01-01 09:00:00  1.030826 -1.306481  0.438610 -1.817053
4 2018-01-01 12:00:00 -1.191646 -1.700694  1.007190 -1.932421
5 2018-01-01 15:00:00 -1.803248  0.415256  0.690243  1.387650
6 2018-01-01 18:00:00 -0.304502  0.514616  0.974318 -0.062800
7 2018-01-01 21:00:00 -0.668874 -1.262635 -0.504298 -0.043383
8 2018-01-02 00:00:00 -0.943615  1.010958  1.343095  0.119853

或者通过concat连接'inner'并将时间戳记设置为索引

pd.concat([x.set_index('Timestamp') for x in lst], axis=1, join='inner')

答案 1 :(得分:1)

如果以相同的方式(例如,date)命名每个时间戳列,则可以进行如下操作:

def common_stamps(*args): # *args lets you feed it any number of dataframes
    
    df = pd.concat([df_i.set_index('date') for df_i in args], axis=1)\
           .dropna()\ # this removes all rows with `uncommon stamps`
           .reset_index()
    
    return df
    
df = common_stamps(df1, df2, df3, df4)

print(df)

输出:

                 date     data1     data2     data3     data4
0 2018-01-01 00:00:00 -0.667090  0.487676 -1.001807 -0.200328
1 2018-01-01 03:00:00 -1.639815  2.320734 -0.396013 -1.838732
2 2018-01-01 06:00:00  0.469890  0.626428  0.040004 -2.063454
3 2018-01-01 09:00:00 -0.916928 -0.260329 -0.598313  0.383281
4 2018-01-01 12:00:00  0.132670  1.771344 -0.441651  0.664980
5 2018-01-01 15:00:00 -0.761542  0.255955  1.378836 -1.235562
6 2018-01-01 18:00:00 -0.120083  0.243652 -1.261733  1.045454
7 2018-01-01 21:00:00  0.339921 -0.901171  1.492577 -0.797161
8 2018-01-02 00:00:00 -1.397864 -0.173818 -0.581590 -0.402472
相关问题