在两个数据帧上应用熊猫分组依据



我有两个数据帧。它们的形状和形式相同。它们每个都包含多个模拟,并且每个模拟在相同数量的步骤上划线,表示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()但我真的不知道如何应用它来组合两个数据帧。

当然,这是一个构造的例子。在我的真实数据中,我有一堆值列,数千次模拟和数百步的时间变量。

同样,我保证数据帧具有相同的形状,并且两个数据帧中的列simtime将相同。

我认为需要按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

最新更新