2

说我有看起来像这样的 DataFrame

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

基本上,它将前两行展平并将其作为附加列。我怎样才能有效地实现这一目标?(另外,我也可以有唯一的列标题)

4

3 回答 3

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
于 2013-08-27T07:45:50.753 回答
1

Pandas 具有丰富的滚动计算功能,这意味着您不应该这样做。这些将大大提高效率(并且更容易推理)。

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

注意:您还可以将 freq 设置为 DateOffset(例如天、分钟、小时等),这将更难以通过 reshape 进行,这为您提供了很大的灵活性。

有关更多示例,以及如何编写通用应用程序,请参阅文档。

于 2013-08-27T10:13:17.647 回答
0

我会将原始数据框复制两次,然后在第一个副本(df1)中删除前两行,在第二个副本(df2)中删除第一行。然后按以下顺序合并这三个数据框中的列: df1.A .. df1.D df2.A .. df2.D df.A .. df.D

抱歉没有真正的代码,我是用手机写的

于 2013-08-27T06:54:46.293 回答