在两个数据帧上应用groupby

2024-05-14 00:41:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 数据dataframedf数量timeinit时间sim
1条回答
网友
1楼 · 发布于 2024-05-14 00:41:46

我认为need filter by ^{}-从0开始,减去1,然后^{}切换到hr并按^{}排序:

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

相关问题 更多 >