将pandas groupby应用于两个数据帧

时间:2018-03-16 08:21:31

标签: python pandas pandas-groupby

我有两个数据帧。它们的形状和形状相同。它们每个都包含许多模拟,每个模拟都在相同数量的步骤上展开,表示为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列在两个数据框中都是相同的。

1 个答案:

答案 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