【发布时间】:2021-10-06 02:45:51
【问题描述】:
我有一个这种格式的大数据框,调用它df:
| index | val1 | val2 |
|---|---|---|
| 0 | 0.2 | 0.1 |
| 1 | 0.5 | 0.7 |
| 2 | 0.3 | 0.4 |
我要插入一行,请致电myrow:
| index | val1 | val2 |
|---|---|---|
| -1 | 0.9 | 0.9 |
我希望在原始数据框中的每一行之后插入此行 3 次,即:
| index | val1 | val2 |
|---|---|---|
| 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 次重复:
| index | val1 | val2 |
|---|---|---|
| -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 分配。 如何让我的解决方案更高效?
【问题讨论】:
-
'index'是您的实际数据帧索引,还是标有“索引”的列? -
@ALollz 是一栏
-
对于它的价值,在循环中使用
df.loc、pd.concat或df.append非常慢。您应该先尝试收集所有数据,然后再将其转换为 DataFrame。查看this answer 了解更多讨论和示例。
标签: python pandas dataframe performance numpy