我将相同的表组合如下:
pd.concat([df_dates,
df_dates,
df_dates,
df_dates]
如何更简单地编写代码
答案 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
,这在这里是不可取的