concat的替代方案

时间:2017-01-24 16:53:49

标签: python date pandas

我将相同的表组合如下:

   pd.concat([df_dates,
               df_dates,
               df_dates,
               df_dates]

如何更简单地编写代码

2 个答案:

答案 0 :(得分:2)

你可以使用 pd.concat([df_dates] * 4)

正如您可能猜到的那样,*4使用该元素4次。

答案 1 :(得分:2)

在效率方面不确定你的意思,但这里有两种方法:

In [32]:
df = pd.DataFrame(np.random.randn(3,2), columns=list('ab'))
df

Out[32]:
          a         b
0  0.108453 -2.875348
1 -1.502857  0.057709
2  0.356384 -0.870802

你可以在列表中重复df:

In [33]:    
pd.concat([df]*4)

Out[33]:
          a         b
0  0.108453 -2.875348
1 -1.502857  0.057709
2  0.356384 -0.870802
0  0.108453 -2.875348
1 -1.502857  0.057709
2  0.356384 -0.870802
0  0.108453 -2.875348
1 -1.502857  0.057709
2  0.356384 -0.870802
0  0.108453 -2.875348
1 -1.502857  0.057709
2  0.356384 -0.870802

但更快使用np.tile并重复df:

In [56]:
pd.DataFrame(np.tile(df,(4,1)), columns= df.columns)

Out[56]:
           a         b
0   0.108453 -2.875348
1  -1.502857  0.057709
2   0.356384 -0.870802
3   0.108453 -2.875348
4  -1.502857  0.057709
5   0.356384 -0.870802
6   0.108453 -2.875348
7  -1.502857  0.057709
8   0.356384 -0.870802
9   0.108453 -2.875348
10 -1.502857  0.057709
11  0.356384 -0.870802

<强>定时

In [57]:
%timeit pd.concat([df]*4)
%timeit pd.DataFrame(np.tile(df,(4,1)), columns= df.columns)

1000 loops, best of 3: 621 µs per loop
10000 loops, best of 3: 142 µs per loop

在这里你可以看到,即使在这个小数据集上,numpy方法也会快4倍以上,并且对于大型数据集会扩展得更好,特别是当你增加重复数时:

In [65]:
%timeit pd.concat([df]*400)
%timeit pd.DataFrame(np.tile(df,(400,1)), columns= df.columns)

10 loops, best of 3: 37.5 ms per loop
10000 loops, best of 3: 152 µs per loop

这里有400次重复,我们看到numpy快〜300 x

<强>更新

感谢@Jeff指出这一点,如果你的df混合了dtypes(就df而言,不是特定的列),那么dtypes将会被激活:

In [2]:
df = pd.DataFrame({'a':np.random.randn(3),'b':np.arange(3)})
df

Out[2]:
          a  b
0 -0.016903  0
1  1.440656  1
2 -1.073728  2

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

Out[3]:
           a    b
0  -0.016903  0.0
1   1.440656  1.0
2  -1.073728  2.0
3  -0.016903  0.0
4   1.440656  1.0
5  -1.073728  2.0
6  -0.016903  0.0
7   1.440656  1.0
8  -1.073728  2.0
9  -0.016903  0.0
10  1.440656  1.0
11 -1.073728  2.0

此处列{&#39; b&#39;的int64 dtype现在已经转换为float64,这在这里是不可取的