gpt4 book ai didi

python - Pandas:高效插入大量行

转载 作者:行者123 更新时间:2023-12-04 07:19:32 25 4
gpt4 key购买 nike

我有一个这种格式的大数据框,称之为 df :


指数
值1
值2


0
0.2
0.1

1
0.5
0.7

2
0.3
0.4


我有一行要插入,叫这个 myrow :


指数
值1
值2


-1
0.9
0.9


我希望在原始数据框中的每一行之后插入该行 3 次,即:


指数
值1
值2


0
0.2
0.1

-1
0.9
0.9

-1
0.9
0.9

-1
0.9
0.9

1
0.5
0.7

-1
0.9
0.9

-1
0.9
0.9

-1
0.9
0.9

2
0.3
0.4

-1
0.9
0.9

-1
0.9
0.9

-1
0.9
0.9


这很简单,有一点循环。 TLDR:我如何更有效地做到这一点?
让我们创建一个重复行函数,并创建我们的 3 个重复组:

import pandas as pd
import numpy as np

def repeat_rows(df, n):
newdf = pd.DataFrame(np.repeat(df.values, n, axis=0))
newdf.columns = df.columns
return newdf

repeats = repeat_rows(myrow.to_frame().T, 3)
现在我们有 3 次重复:


指数
值1
值2


-1
0.9
0.9

-1
0.9
0.9

-1
0.9
0.9


最后,我们可以遍历原始 df的行,并连接 repeats到行,并将所有这些的结果连接在一起:
blocks = []
for _, row in df.iterrows():
blocks.append(pd.concat([row.to_frame().T, repeats]))
result = pd.concat(blocks)
我们现在得到了想要的结果!
问题是,这很慢,我正在寻找更快的解决方案。
我猜更好的解决方案将遵循这种模式:
result = repeat_rows(df, 4)
result.loc[LAST_3_ROWS_IN_EACH_BLOCK_OF_4] = myrow
但是,我不确定如何进行这样的 loc 分配。 我怎样才能使我的解决方案更有效?

最佳答案

reset_index以便 df有一个简单的 RangeIndex。然后我们可以用平铺进行数学运算并重复创建一个索引,排序时将放置 myrow 中的 3 个。 DataFrame 的每一行之间的行。最后删除这个Index并恢复正常 RangeIndex .
样本数据

import pandas as pd
import numpy as np

myrow = pd.DataFrame({'index': [-1], 'val1': [0.9], 'val2': [0.9]})
df = pd.DataFrame({'index': [0,1,2],
'val1': [0.2, 0.5, 0.3],
'val2': [0.1, 0.7, 0.4]})
代码
# Ensure starting from a RangeIndex
df = df.reset_index(drop=True)

NR = 3 # Number of repeats

mr = pd.concat([myrow]*len(df)*NR, ignore_index=True)
mr.index = df.index.repeat(NR) + np.tile(np.arange(0, 1, 1/NR), len(df))

# `mr` second in the `concat` so rows go below
df = pd.concat([df, mr]).sort_index().reset_index(drop=True)
    index  val1  val2
0 0 0.2 0.1
1 -1 0.9 0.9
2 -1 0.9 0.9
3 -1 0.9 0.9
4 1 0.5 0.7
5 -1 0.9 0.9
6 -1 0.9 0.9
7 -1 0.9 0.9
8 2 0.3 0.4
9 -1 0.9 0.9
10 -1 0.9 0.9
11 -1 0.9 0.9

关于python - Pandas:高效插入大量行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68592930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com