如何以这种形状使用python和pandas堆叠数据?

时间:2019-12-26 23:23:56

标签: python pandas dataframe append reshape

我完全迷路了,需要您的帮助。我有N个数据集,每个数据集都有m列和以列表形式的x * N行。

x =主题数量

N =任务数量

param1和param2 =正在收敛的参数

每个数据集都由每个主题的每种情况的线性模型参数组成

df_1= {'id': [1, 2], 'task': [1, 1], 'param1': [1, 2],'param2': [0.5,0.8]} 
df_1 = pd.DataFrame(df_1, columns = ['id', 'task','param1', 'param2'])

id  task    param1  param2 
1   1       1       0.5 
2   1       2       0.8

df_2= {'id': [1, 1, 2, 2], 'task': [1, 2, 1, 2], 'param1': [1.2, 3.2,
2.1, 3.2],'param2': [0.4, 1.1, 0.8, 2.2]} 
df_2 = pd.DataFrame(df_2, columns = ['id', 'task','param1', 'param2'])

id  task    param1  param2 
1   1       1.2     0.4 
1   2       3.2     1.1 
2   1       2.1     0.8 
2   2       3.2     2.2


df_3= {'id': [1, 1, 1, 2, 2, 2], 'task': [1, 2, 3, 1, 2, 3], 'param1': [1.1, 3.1, 2.2, 2.3, 3.2, 1.1],'param2': [0.35, 1.05, 0.7, 0.8, 2.2,
1.1]} 
df_3 = pd.DataFrame(df_3, columns = ['id', 'task','param1', 'param2'])

id  task    param1  param2 
1   1       1.1     0.35 
1   2       3.1     1.05 
1   3       2.2     0.7 
2   1       2.3     0.8 
2   2       3.2     2.2 
2   3       1.1     1.1

这种趋势一直持续到df_N,直到df_N中有x * N条线为止。

我需要将所有df堆叠在一起,并附上一些规则,以便df_final仍然具有x * N行,但对于每个id和每个任务,如果我们有关于任务的信息在此任务之前我们会将它们附加在一起,列的顺序无关紧要,列的dtype也无关紧要,NA值不应为0。有关任务的信息应按人员的ID进行堆叠

最终结果应如下所示:

id  task    1param1 1param2 2param1 2param2 3param1 3param3 
1   1       1       0.5 
1   2       1.2     0.4     3.2     1.1 
1   3       1.1     0.35    3.1     1.05    2.2     0.7 
2   1       2       0.8 
2   2       2.1     0.8     3.2     2.2 
2   3       2.3     0.8     3.2     2.2     1.1     1.1

非常感谢您的帮助!

编辑:对长格式,很抱歉,现在看起来已经完成了(这是出于科学目的)。

2 个答案:

答案 0 :(得分:2)

如果数据框位于名为datasets的列表中,则可以执行以下操作:

final_df = pd.DataFrame(columns=['id','task'])
for i, df in enumerate(datasets):
    final_df = final_df.merge(df, how='outer', on=['id', 'task'], suffixes=(str(i),''), sort=True)

答案 1 :(得分:1)

看来您的最终数据帧并不是真正地以idtask为键,而是真正地以iddf_num为键,然后各列分别为task+param1task+param2。因此,您真正需要做的是:

final_df = pd.DataFrame(columns=['id','df'])
final_df.set_index(['id','df'], inplace=True)
for i, df in enumerate(datasets):
    for _,row in df.iterrows():
        final_df.loc[(int(row['id']),i+1), str(int(row['task'])) + 'param1'] = row['param1']
        final_df.loc[(int(row['id']),i+1), str(int(row['task'])) + 'param2'] = row['param2']

final_df.sort_index(inplace=True)

执行上面的代码后,final_df的外观如下:

       1param1  1param2  2param1  2param2  3param1  3param2
id df
1  1       1.0     0.50      NaN      NaN      NaN      NaN
   2       1.2     0.40      3.2     1.10      NaN      NaN
   3       1.1     0.35      3.1     1.05      2.2      0.7
2  1       2.0     0.80      NaN      NaN      NaN      NaN
   2       2.1     0.80      3.2     2.20      NaN      NaN
   3       2.3     0.80      3.2     2.20      1.1      1.1