我有两个数据帧。它们的形状和形状相同。它们每个都包含许多模拟,每个模拟都在相同数量的步骤上展开,表示为time
。
df_init = pd.DataFrame({'sim' : [1, 1, 1, 1, 2, 2, 2, 2],
'time' : [0, 1, 2, 3, 0, 1, 2, 3],
'values' : [1, 2, 1, 0, 2, 1, 2, 3]
})
df_next = pd.DataFrame({'sim' : [1, 1, 1, 1, 2, 2, 2, 2],
'time' : [0, 1, 2, 3, 0, 1, 2, 3],
'values' : [2, 4, 5, 6, 3, 4, 5, 7]
})
df_init
Out[3]:
sim time values
0 1 0 1
1 1 1 2
2 1 2 1
3 1 3 0
4 2 0 2
5 2 1 1
6 2 2 2
7 2 3 3
df_next
Out[4]:
sim time values
0 1 0 2
1 1 1 4
2 1 2 5
3 1 3 6
4 2 0 3
5 2 1 4
6 2 2 5
7 2 3 7
我想构建一个新的数据框,其中每个模拟sim
的第一个n
时间步长来自df_init
,其余来自df_next
。
如果例如n=2
,结果将如下所示
df_result
Out[3]:
sim time values
0 1 0 1
1 1 1 2
2 1 2 5
3 1 3 6
4 2 0 2
5 2 1 1
6 2 2 5
7 2 3 7
如果只有一次模拟,这很容易
df_next.iloc[:n] = df_init.iloc[:n]
但是当有一堆模拟时我怎么能这样做呢?我想过groupby()
,但我真的不知道如何应用它来组合两个数据帧。
这当然是一个构造的例子。在我的真实数据中,我有一堆价值列,成千上万的模拟和时间变量几百步。
同样,我保证数据框具有相同的形状,并且sim
和time
列在两个数据框中都是相同的。
答案 0 :(得分:1)
我认为需要按cumcount
过滤 - 从0
开始,因此减去1
,然后concat
togetehr并按sort_values
排序:
n=2
a = df_init[df_init.groupby('sim').cumcount() <= n-1]
b = df_next[df_next.groupby('sim').cumcount() > n-1]
df = pd.concat([a,b]).sort_values('sim')
print (df)
sim time values
0 1 0 1
1 1 1 2
2 1 2 5
3 1 3 6
4 2 0 2
5 2 1 1
6 2 2 5
7 2 3 7