【问题标题】:How to duplicate Python dataframe one by one? [duplicate]如何一一复制Python数据框? [复制]
【发布时间】:2017-05-07 00:42:35
【问题描述】:

我有一个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由循环构成,但效率不高。

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

【问题讨论】:

  • "one by one" 并没有说明您的意思是按行还是按列。您想复制每一 n 次。

标签: python pandas dataframe


【解决方案1】:

构建一维索引器以对 values 数组和 index 进行切片。您还必须注意索引以获得所需的结果。

  • np.arange 上使用np.repeat 来获取索引器
  • 使用此索引器在值和索引上构造一个新的数据帧

r = np.arange(len(df)).repeat(3)
pd.DataFrame(df.values[r], df.index[r], df.columns)

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

【讨论】:

  • 你的意思是当大人物的妻子坚持他们做的事情不是回答关于 SO 的问题时:-)
  • 是的。我不得不开车送我们的女儿去参加一个多小时的毕业舞会,所以我有空......
【解决方案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)

【讨论】:

  • 您也缺少重复的索引
【解决方案3】:

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

代码:

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

【讨论】:

  • 你也搞定了索引……即使它变慢了。
【解决方案4】:

您可以将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 失败:

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

【讨论】:

  • 加我一份!
【解决方案5】:

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

#Build a index array and extract the rows to build the desired new df. This handles index and data all at once.    
df.iloc[np.repeat(df.index,3)]

Out[270]: In [271]: 
   a  b
0  1  2
0  1  2
0  1  2
1  3  4
1  3  4
1  3  4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2020-08-31
    • 2020-08-07
    • 2018-10-28
    • 2019-04-27
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多