python - 在数据框中复制行 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 向量化的信息,但不幸的是,我不知道在这种情况下它是否(以及如何)有帮助,因为我必须向数据框添加很多行。
有什么建议可以提高性能吗?
解决方案
使用Index.repeat
if 唯一索引值,然后传递给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.repeat
和DataFrame.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
推荐阅读
- python - 您可以使用 Python 将数学表达式输出到 MS Word、PDF 或 HTML 文件中吗?
- networking - 私有子网中的 EC2 实例访问 Internet 端口转发的端点 IP 白名单
- docker - Docker nginx 响应所有请求参数
- python - 是否可以从查询集中生成哈希?
- css - 如何在 Less 中将两个变量连接为选择器
- c# - CsvHelper:数据验证异常未提供有关异常的足够信息以提供帮助
- javascript - 检查列中另一个工作表中的数据以引用行中的数据
- r - 如何为散点图对角线的选定部分着色?
- javascript - 在渲染从组件中的后端获取的数据时渲染问题
- javascript - 通过 Apps 脚本在 DocumentApp InlineImage 中设置宽度和高度比例?