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

时间:2020-03-02 17:10:17

标签: pandas dataframe concatenation transpose

我有一些使用以下代码从熊猫合并过程中衍生的DF;

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

..等等

每个DF都将具有包含Datetime格式的'time'的列(例如:2019-11-22 13:18:00.000)和第二个包含数字(即0.06)的列。不同的DF将具有不同的“时间”仓位。我正在尝试将所有DF合并为一个,其中生成的DF的某些元素可能包含“ NaN”。 DF的Datetime格式在使用时产生错误;

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

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

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

行:是'DiffA','DiffB'.. etc 列:相应地是时间段。

尝试了使用单个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

1 个答案:

答案 0 :(得分:2)

解决方案

核心逻辑:您需要在列'time'到每个merge的{​​{1}}上使用 outer-join 实现您的目标。最后,将索引重置为 time 列即可完成解决方案。

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

注意:我已将df用作最终数据帧,并将df0用作原始数据帧。我的df0是您的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)

输出

enter image description here

虚拟数据

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