我有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
?
答案 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