将Pandas数据框复制N次

6

目前,如果我将列表乘以一个数,如x = [1,2,3]* 2,那么我得到的x是[1,2,3,1,2,3]。但这在Pandas中不起作用。

所以如果我想复制一个PANDAS数据框,我必须将一列转化为列表并进行乘法操作:

col_x_duplicates =  list(df['col_x'])*N

new_df = DataFrame(col_x_duplicates, columns=['col_x'])

然后在原始数据上执行联接操作:

pd.merge(new_df, df, on='col_x', how='left')

这样可以将pandas数据框复制N次,有更简单或者更快的方法吗?

2
Numpy 的 repeat() 在这里可能是有用的(而且快速的)。参见 https://dev59.com/QnI_5IYBdhLWcg3wDOhC。 - capitalistcuttle
你想让输出列看起来像[1,2,3,1,2,3]还是[1,1,2,2,3,3] - DSM
2个回答

8

实际上,如果您想复制整个数据帧(而不是每个元素),则numpy.tile()可能更好:

In [69]: import pandas as pd

In [70]: arr = pd.np.array([[1, 2, 3], [4, 5, 6]])

In [71]: arr
Out[71]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [72]: df = pd.DataFrame(pd.np.tile(arr, (5, 1)))

In [73]: df
Out[73]: 
   0  1  2
0  1  2  3
1  4  5  6
2  1  2  3
3  4  5  6
4  1  2  3
5  4  5  6
6  1  2  3
7  4  5  6
8  1  2  3
9  4  5  6

[10 rows x 3 columns]

In [75]: df = pd.DataFrame(pd.np.tile(arr, (1, 3)))

In [76]: df
Out[76]: 
   0  1  2  3  4  5  6  7  8
0  1  2  3  1  2  3  1  2  3
1  4  5  6  4  5  6  4  5  6

[2 rows x 9 columns]

谢谢,这很棒!可惜在大型pandas数据框上运行时速度如此缓慢! - redrubia
你知道有没有快捷的方法吗? - redrubia
@redrubia 你是否多次调用了tile()函数?这可能会很慢,因为每次都会分配额外的内存。如果你知道最终大小(在所有复制之后),可以尝试初始化一个相应大小的零numpy数组,然后使用切片填充它。 - capitalistcuttle
@redrubia 如果您不需要修改重复的数据,请尝试重构代码,以便在某处保存索引并重复访问相同的数据框,而不是创建新的平铺数据框。这样,您就不必支付分配更多内存的成本。这是另一种实现相同功能的方法:https://dev59.com/Q2035IYBdhLWcg3wMNGW - capitalistcuttle

6

这是一个一行代码的方法,用于按DataFrame df的内容复制n次生成新的DataFrame。

n_df = pd.concat([df] * n)

例子:

df = pd.DataFrame(
    data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], 
    columns=['id', 'temp', 'name'], 
    index=pd.Index([1, 2, 3], name='row')
)
n = 4
n_df = pd.concat([df] * n)

那么n_df将是以下DataFrame:

    id  temp    name
row         
1   34  null    mark
2   22  null    mark
3   34  null    mark
1   34  null    mark
2   22  null    mark
3   34  null    mark
1   34  null    mark
2   22  null    mark
3   34  null    mark
1   34  null    mark
2   22  null    mark
3   34  null    mark

请注意,此答案会导致与已接受答案不同(即重复)的索引标签。这可能是您想要的,也可能不是,具体取决于您的用例。我认为OP没有表达对索引标签的任何偏好。 - ckrk
只是要注意,concat方法比np.tile方法慢得多(大约慢100倍)。 - Matti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接