首页 > 解决方案 > 在数据框中复制行 x 次 - 提高性能

问题描述

我正在寻找复制数据帧行的最有效解决方案。每行应复制 x 次,其中 x 对于每行都是唯一的。

假设这是我给定的数据框:

| id | count |
|----|-------|
| a  | 1     |
| b  | 2     |
| c  | 5     |

结果数据框应如下所示,其中每一行都按“count”列中给出的数量复制:

| id | count |
|----|-------|
| a  | 1     |
| b  | 2     |
| b  | 2     |
| c  | 5     |
| c  | 5     |
| c  | 5     |
| c  | 5     |
| c  | 5     |

一种非常基本的方法是遍历数据帧并像这样附加行 x 次:

data = {'id': ['a', 'b', 'c'], 'count': [1, 2, 5]}
df = pd.DataFrame(data=data)

for index, row in df.iterrows():
    for x in range(row['count']-1):
        df = df.append(pd.Series(row, index=df.columns), ignore_index=True)

df = df.sort_values(by=['id'])
df = df.reset_index(drop=True)

df

虽然这适用于小型数据帧,但对于具有数千行的大型数据帧来说效率不是很高。由于每行必须复制多达 200 次,最终数据帧可以包含数百万行。

已经阅读过关于 pandas/numpy 向量化的信息,但不幸的是,我不知道在这种情况下它是否(以及如何)有帮助,因为我必须向数据框添加很多行。

有什么建议可以提高性能吗?

标签: pythonpandasdataframe

解决方案


使用Index.repeatif 唯一索引值,然后传递给DataFrame.loc

df1 = df.loc[df.index.repeat(df['count'])].reset_index(drop=True)
print (df1)
  id  count
0  a      1
1  b      2
2  b      2
3  c      5
4  c      5
5  c      5
6  c      5
7  c      5

如果可能,可以使用索引值中的一些重复项numpy.repeatDataFrame.iloc

print (df)
  id  count
0  a      1
1  b      2
1  c      5

df1 = df.iloc[np.repeat(np.arange(len(df.index)), df['count'])].reset_index(drop=True)
print (df1)
  id  count
0  a      1
1  b      2
2  b      2
3  c      5
4  c      5
5  c      5
6  c      5
7  c      5

推荐阅读