2013-08-27 161 views
2

说我有数据帧,看起来像这样滚动重塑蟒蛇大熊猫据帧

In [5]: dates = pd.date_range('20130101',periods=6) 

In [6]: dates 

<class 'pandas.tseries.index.DatetimeIndex'> 
[2013-01-01 00:00:00, ..., 2013-01-06 00:00:00] 
Length: 6, Freq: D, Timezone: None 

In [7]: df = pd.DataFrame(np.arange(0,24).reshape([6,4]),index=dates,columns=list('ABCD')) 

In [8]: df 

      A B C D 
2013-01-01 0 1 2 3 
2013-01-02 4 5 6 7 
2013-01-03 8 9 10 11 
2013-01-04 12 13 14 15 
2013-01-05 16 17 18 19 
2013-01-06 20 21 22 23 

我想重塑df弄成这个样子

   A B C D A_1 B_1 C_1 D_1 A_2 B_2 C_2 D_2 
2013-01-03 8 9 10 11 4  5  6  7  0  1  2  3 
2013-01-04 12 13 14 15 8  9  10 11 4  5  6  7 
2013-01-05 16 17 18 19 12 13 14 15 8  9  10 11 
2013-01-06 20 21 22 23 16 17 18 19 12 13 14 15 

基本上,它压扁之前的两行把它作为额外的列。我怎样才能有效地实现这一点? (也可我有独特的列标题太)

+0

这不应该是必要的,你可以使用rolling_apply和朋友做计算* *没有这个整形黑客。 –

回答

0

我将重复两次你原来的数据帧,然后在第一个副本(DF1)删除第一个两行,在第二(DF2)删除第一行。然后合并这三个数据框中列顺序如下: df1.A .. df1.D df2.A .. df2.D df.A .. df.D

sorrt为没有真正的代码,我是从我的电话写

2

我真的不知道你为什么会这么做,但在这里是如何能够做到:

dates = pd.date_range('20130101',periods=6) 
columns = list('ABCD') 
df = pd.DataFrame(np.arange(0,24).reshape([6,4]),index=dates,columns=columns) 

# First setup some constants 
values = df.values.reshape(df.values.size,) 
step = 4 
size = step * len(columns) 
index = df.index[-step:] 

frame = pd.DataFrame(index=df.index[-step:]) 
for i, pos in enumerate(range(df.values.size-size, -1, -step)): 
    cols = columns if i == 0 else map(lambda x: '%s_%s' % (x, i), columns) 
    new_frame = pd.DataFrame(values[pos:pos+size].reshape((step, len(columns))), 
          index=index, columns=cols) 
    frame = pd.concat([frame, new_frame], axis=1) 
print(frame) 

其中给出:

   A B C D A_1 B_1 C_1 D_1 A_2 B_2 C_2 D_2 
2013-01-03 8 9 10 11 4 5 6 7 0 1 2 3 
2013-01-04 12 13 14 15 8 9 10 11 4 5 6 7 
2013-01-05 16 17 18 19 12 13 14 15 8 9 10 11 
2013-01-06 20 21 22 23 16 17 18 19 12 13 14 15 
+0

原因用户可能* *想到他们想要做的,这是自己写的滚动功能(而不是使用熊猫滚动功能,或'rolling_apply')... __they真的* * shouldn't__(见我的答案]( http://stackoverflow.com/a/18462677/1240268))。 –

+0

@AndyHayden如果是这种情况,我完全同意。但他明确表示他想要**滚动重塑**: - 这就是为什么我问他为什么。 –

+0

从来没有理由这样做。 –

1

大熊猫有wealth of rolling computational functions这意味着你不应该这样做。这些将大大提高效率(以及更容易推理)。

Function    Description 
rolling_count   Number of non-null observations 
rolling_sum   Sum of values 
rolling_mean   Mean of values 
rolling_median   Arithmetic median of values 
rolling_min   Minimum 
rolling_max   Maximum 
rolling_std   Unbiased standard deviation 
rolling_var   Unbiased variance 
rolling_skew   Unbiased skewness (3rd moment) 
rolling_kurt   Unbiased kurtosis (4th moment) 
rolling_quantile  Sample quantile (value at %) 
rolling_apply   Generic apply 
rolling_cov   Unbiased covariance (binary) 
rolling_corr   Correlation (binary) 
rolling_corr_pairwise Pairwise correlation of DataFrame columns 
rolling_window   Moving window function 

如果您的最终游戏计划涉及这些......只是使用这些。如果是别的东西,可以考虑把它写成通用滚动应用。

举个例子,这里有一个rolling_mean与您使用同一个窗口:
即计算在每一行和每一以前两行完成。

In [11]: df = pd.DataFrame(np.random.randn(24).reshape([6,4]), 
          index=dates,columns=list('ABCD')) 

In [12]: df 
Out[12]: 
        A   B   C   D 
2013-01-01 0.225416 -1.014222 0.724756 -0.594679 
2013-01-02 1.629553 -1.100808 1.279953 -0.058152 
2013-01-03 -0.633830 0.019230 -0.477937 -0.852657 
2013-01-04 -0.601511 0.704212 -1.535412 -1.044537 
2013-01-05 -0.587404 -1.124893 0.834233 0.117244 
2013-01-06 -0.067674 -0.745053 0.589823 -1.007093 

In [13]: pd.rolling_mean(df, 3) 
Out[13]: 
        A   B   C   D 
2013-01-01  NaN  NaN  NaN  NaN 
2013-01-02  NaN  NaN  NaN  NaN 
2013-01-03 0.407046 -0.698600 0.508924 -0.501829 
2013-01-04 0.131404 -0.125788 -0.244465 -0.651782 
2013-01-05 -0.607582 -0.133817 -0.393039 -0.593317 
2013-01-06 -0.418863 -0.388578 -0.037119 -0.644795 

注意:您还可以设置频率成为DateOffset(例如天,分钟,小时等),这将是更难做一个重塑,这给你很多的灵活性。

See the docs更多的例子,以及如何编写一般的应用。