【问题标题】:fastest way to insert multiple rows into a dataframe given a list of indexes (python)给定索引列表(python)将多行插入数据帧的最快方法
【发布时间】:2019-08-04 22:24:02
【问题描述】:

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

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'])

我想复制列组中每个唯一值的第一行,并将该行插入到每个组的开头,同时增加数据框。我目前可以通过使用 for 循环来实现这一点,但速度很慢,因为我的数据框很大,所以我正在寻找矢量化解决方案。

我有一个要在其中插入行的索引列表。

idxs = [0, 3, 6, 9]

在循环的每次迭代中,我当前将每个 idx 处的数据帧分割成两个数据帧,插入行并连接数据帧。我的数据框非常大,所以这个过程非常缓慢。

解决方案如下所示:

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

【问题讨论】:

  • 必须将行插入其组的开头吗?为什么?这似乎与 pandas 的目的背道而驰。有非常快速的方法可以获取每个组的第一行并将它们全部放在 DataFrame 的 endbeginning 处。
  • 嗨@brentertainer,我实际上将数据帧分解为多个数据帧,将数据放在每个数据帧的开头,然后将它们连接回一个。我需要它们作为一个大型数据帧的原因是因为我对列执行了大量计算,并且通过矢量化方法而不是循环遍历每个子数据帧要快得多。对于后面的一些计算约定,开头的行是必需的。
  • 我明白了。我知道我形成初始 DataFrame 的方法有点慢,所以我很高兴看到它是一种更有效地获得目的的方法!
  • 你的方法仍然比我的快 20%,谢谢!

标签: python pandas dataframe insert concat


【解决方案1】:

您可以通过按group 分组、遍历每个组并通过将组的第一行连接到组本身,然后连接所有这些连接来构造 DataFrame。

代码:

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

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 2021-01-18
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多