说我有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
基本上,它将前两行展平并将其作为附加列。如何有效地实现这一目标? (另外,我也可以使用唯一的列标题)
答案 0 :(得分: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
答案 1 :(得分:1)
Pandas有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
注意:您还可以将freq设置为DateOffset(例如天,分钟,小时等),这对于重塑更难以实现,这为您提供了很大的灵活性。
See the docs了解更多示例,以及如何编写泛型适用。
答案 2 :(得分:0)
我会复制两次原始数据帧,然后在第一个副本(df1)中删除前两行,在第二个(df2)删除第一行。然后按以下顺序合并这三个数据框中的列: df1.A .. df1.D df2.A .. df2.D df.A .. df.D
没有真正的代码,我正在用手机写作