如何将 python 和 pandas 的数据堆叠成这种形状?
How to stack data with python and pandas in this shape?
我完全迷路了,需要你的帮助。我有 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 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
非常感谢您的帮助!
编辑:很抱歉格式化过长,现在看起来已经完成了(这是为了科学)。
如果您的数据框在名为 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)
您的最终数据框似乎并没有真正键入 id
和 task
,而是真正键入 id
和 df_num
然后列是 task+param1
和 task+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
我完全迷路了,需要你的帮助。我有 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 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
非常感谢您的帮助!
编辑:很抱歉格式化过长,现在看起来已经完成了(这是为了科学)。
如果您的数据框在名为 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)
您的最终数据框似乎并没有真正键入 id
和 task
,而是真正键入 id
和 df_num
然后列是 task+param1
和 task+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