合并 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
我有几个 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 anddf0
as the original dataframe. Mydf0
is yourdf
.
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