合并 2 个或多个数据帧并转置结果

Merging 2 or more data frames and transposing the result

我有几个 DF 使用以下代码从 Panda 装箱过程中派生出来;

df2 = df.resample(rule=timedelta(milliseconds=250))[('diffA')].mean().dropna() 
df3 = df.resample(rule=timedelta(milliseconds=250))[('diffB')].mean().dropna()

..等

每个 DF 都会有包含日期​​时间格式(example:2019-11-22 13:18:00.000)的 'time' 的列和包含数字(即 0.06 )的第二列。不同的 DF 将具有不同的 'time' 个 bin。我正在尝试将所有 DF 连接成一个,其中生成的 DF 的某些元素可能包含 'NaN'。 DF的Datetime格式在使用时报错;

方法 1) df4=pd.merge(df2,df3,left_on='time',right_on='time')

方法二)pd.pivot_table(df2, values = 'diffA', index=['time'], columns = 'time').reset_index()

当 DF 合并后,我还想转置生成的 DF,其中:

行:'DiffA'、'DiffB'..等 列:相应地是时间箱。

已尝试对单个 DF 使用 transpose() 方法,只是为了尝试,但由于我的时间/索引采用 'Datetime' 格式而出现错误..

一旦到位,我正在寻找一种方法来从生成的转置 DF 中提取行作为单独的数据系列。

请告诉我如何通过一些指导实现上述目标,感谢任何反馈!非常感谢您的帮助。

数据帧(例如 2)

time                     DiffA
2019-11-25 08:18:01.250 0.06
2019-11-25 08:18:01.500 0.05
2019-11-25 08:18:01.750 0.04
2019-11-25 08:18:02.000 0
2019-11-25 08:18:02.250 0.22
2019-11-25 08:18:02.500 0.06
time                        DiffB
2019-11-26 08:18:01.250    0.2
2019-11-27 08:18:01.500    0.05
2019-11-25 08:18:01.000    0.6
2019-11-25 08:18:02.000    0.01
2019-11-25 08:18:02.250    0.8
2019-11-25 08:18:02.500    0.5

生成的合并 DF 应如下所示(仅文本);

time ( first row )   
2019-11-25 08:18:01.000,     
2019-11-25 08:18:01.250,     
2019-11-25 08:18:01.500,     
2019-11-25 08:18:01.750,     
2019-11-25 08:18:02.000,     
2019-11-25 08:18:02.250,     
2019-11-25 08:18:02.500,     
2019-11-26 08:18:01.250,     
2019-11-27 08:18:01.500

(第二行)

diffA   nan 0.06    0.05    0.04    0   0.22    0.06    nan nan

(第三行)

diffB   0.6 nan nan nan 0.01    0.8 0.5 0.2 0.05

解决方案

核心逻辑:需要在'time'merge列上使用outer-join每个采样数据帧一起实现你的objective。最后将索引重置为列 time 完成解决方案。

我将使用我在下面创建的虚拟数据来创建可重现的解决方案。

Note: I have used df as the final dataframe and df0 as the original dataframe. My df0 is your df.

df = pd.DataFrame()
for i, column_name in zip(range(5), column_names):
    if i==0:
        df = df0.sample(n=10, random_state=i).rename(columns={'data': f'df{column_name}'})
    else:
        df_other = df0.sample(n=10, random_state=i).rename(columns={'data': f'df{column_name}'})
        df = pd.merge(df, df_other, on='time', how='outer')

print(df.set_index('time').T)

输出

虚拟数据

import pandas as pd

# dummy data:
df0 = pd.DataFrame()
df0['time'] = pd.date_range(start='2020-02-01', periods=15, freq='D')
df0['data'] = np.random.randint(0, high=9, size=15)
print(df0)

输出:

         time  data
0  2020-02-01     6
1  2020-02-02     1
2  2020-02-03     7
3  2020-02-04     0
4  2020-02-05     8
5  2020-02-06     8
6  2020-02-07     1
7  2020-02-08     6
8  2020-02-09     2
9  2020-02-10     6
10 2020-02-11     8
11 2020-02-12     3
12 2020-02-13     0
13 2020-02-14     1
14 2020-02-15     0