在给定索引列表的情况下,将多行插入数据帧的最快方法(python)

在给定索引列表的情况下,将多行插入数据帧的最快方法(python),python,pandas,dataframe,insert,concat,Python,Pandas,Dataframe,Insert,Concat,我有一个dataframe,我想在dataframe中每个组的开头插入特定索引处的行。例如,假设我有以下数据帧: 将熊猫作为pd导入 数据帧(数据=['A',1,1],'A',2,3],'A',5,4],'B',3,4],'B',2,6],'B',8,4],'C',9,3],'C',3,7],'C',1,9],'D',2,3],'D',4,7],[Group','val1','val2'] 我想复制列组中每个唯一值的第一行,并在数据帧增长时将该行插入每个组的开头。目前,我可以通过使用for循环

我有一个dataframe,我想在dataframe中每个组的开头插入特定索引处的行。例如,假设我有以下数据帧:

将熊猫作为pd导入
数据帧(数据=['A',1,1],'A',2,3],'A',5,4],'B',3,4],'B',2,6],'B',8,4],'C',9,3],'C',3,7],'C',1,9],'D',2,3],'D',4,7],[Group','val1','val2']
我想复制列组中每个唯一值的第一行,并在数据帧增长时将该行插入每个组的开头。目前,我可以通过使用for循环来实现这一点,但速度非常慢,因为我的数据帧很大,所以我正在寻找矢量化的解决方案

我有一个要插入行的索引列表

idxs=[0,3,6,9]
在循环的每次迭代中,我当前将每个IDX处的数据帧切片为两个数据帧,插入行,并合并数据帧。我的数据帧非常大,所以这个过程非常缓慢

解决方案如下所示:

组val1 val2
0 A 1 1
一一一一
2 A 2 3
3 A 5 4
4 B 3 4
5 B 3 4
6B26
7 B 8 4
8 C 9 3
9 C 9 3
10 C 3 7
11 C 19
12 D 5
13 D 5
14 D 8 3
15 D 4 7

您可以通过按
组进行分组,迭代每个组,并通过将组的第一行中的每一行连接到组本身,然后连接所有这些连接来构造数据帧来实现这一点

代码:

import pandas as pd

df = pd.DataFrame(data=[['A',1,1],['A',2,3],['A',5,4],['B',3,4],['B',2,6],['B',8,4],['C',9,3],['C',3,7],['C',1,9],['D',5,5],['D',8,3],['D',4,7]], columns=['Group','val1','val2'])

df_new = pd.concat([
    pd.concat([grp.iloc[[0], :], grp])
    for key, grp in df.groupby('Group')
])
print(df_new)
   Group  val1  val2
0      A     1     1
0      A     1     1
1      A     2     3
2      A     5     4
3      B     3     4
3      B     3     4
4      B     2     6
5      B     8     4
6      C     9     3
6      C     9     3
7      C     3     7
8      C     1     9
9      D     5     5
9      D     5     5
10     D     8     3
11     D     4     7
输出:

import pandas as pd

df = pd.DataFrame(data=[['A',1,1],['A',2,3],['A',5,4],['B',3,4],['B',2,6],['B',8,4],['C',9,3],['C',3,7],['C',1,9],['D',5,5],['D',8,3],['D',4,7]], columns=['Group','val1','val2'])

df_new = pd.concat([
    pd.concat([grp.iloc[[0], :], grp])
    for key, grp in df.groupby('Group')
])
print(df_new)
   Group  val1  val2
0      A     1     1
0      A     1     1
1      A     2     3
2      A     5     4
3      B     3     4
3      B     3     4
4      B     2     6
5      B     8     4
6      C     9     3
6      C     9     3
7      C     3     7
8      C     1     9
9      D     5     5
9      D     5     5
10     D     8     3
11     D     4     7

行必须插入到其组的开头吗?为什么?这似乎与熊猫的本意背道而驰。有非常快速的方法来获取每个组的第一行,并将它们全部放在数据帧的末尾或开头。嗨@brentertainer,我实际上是将数据帧分解为多个数据帧,将数据放在每个数据帧的开头,然后将它们合为一个。我之所以需要将它们作为一个大数据帧,是因为我对列执行了大量计算,通过矢量化方法进行计算比通过每个子数据帧循环要快得多。开头的行对于后面的一些计算约定是必需的。我明白了。我知道我形成初始数据帧的方法有点慢,所以我很高兴读到这是一种实现更高效的目的的方法!你的方法仍然比我的快20%,所以谢谢你!