我有一些使用以下代码从熊猫合并过程中衍生的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
答案 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)
输出:
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