如何逐个复制Python数据框?

时间:2017-05-07 00:42:36

标签: python pandas dataframe

我有pandas.DataFrame如下:

df1 = 
    a    b
0   1    2
1   3    4

我想这三次成为:

df2 =
    a    b
0   1    2
0   1    2
0   1    2
1   3    4
1   3    4
1   3    4

df2来自循环,但效率不高。

如何使用更快的矩阵方式从df2获取df1

4 个答案:

答案 0 :(得分:2)

我不知道它是否比你的循环更有效,但它很容易构造为:

<强>代码:

pd.concat([df] * 3).sort_index()

测试代码:

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('ab'))
print(pd.concat([df] * 3).sort_index())

<强>结果:

   a  b
0  1  2
0  1  2
0  1  2
1  3  4
1  3  4
1  3  4

答案 1 :(得分:2)

您可以使用np.repeat

df = pd.DataFrame(np.repeat(df.values,[3,3], axis = 0), columns = df.columns)

你得到了

    a   b
0   1   2
1   1   2
2   1   2
3   3   4
4   3   4
5   3   4

时间测试:

%timeit pd.DataFrame(np.repeat(df.values,[3,3], axis = 0))
1000 loops, best of 3: 235 µs per loop

%timeit pd.concat([df] * 3).sort_index()
best of 3: 1.26 ms per loop

Numpy在大多数情况下肯定更快,所以没有惊喜

编辑:我不确定你是否会寻找重复的指数,但是你会这样做,

pd.DataFrame(np.repeat(df.values,3, axis = 0), index = np.repeat(df.index, 3), columns = df.columns)

答案 2 :(得分:1)

您可以将numpy.repeat与参数标量3一起使用,然后将columns参数添加到DataFrame构造函数中:

df = pd.DataFrame(np.repeat(df.values, 3, axis=0), columns=df.columns)
print (df)
   a  b
0  1  2
1  1  2
2  1  2
3  3  4
4  3  4
5  3  4

如果真的想要重复索引,那么可能会使reindex失败的一些pandas函数变得复杂:

r = np.repeat(np.arange(len(df.index)), 3)
df = pd.DataFrame(df.values[r], df.index[r], df.columns)
print (df)
   a  b
0  1  2
0  1  2
0  1  2
1  3  4
1  3  4
1  3  4

答案 3 :(得分:0)

不是最快的(也不是最慢的),而是目前为止最短的解决方案。

    user.discord = request.discord
    user.reddit = request.reddit