使用.unstack迭代pandas dataframes /重塑数据框架的列表



我有一个带有dateTimeIndex的dataframe:

                          X
timestamp                    
2013-01-01 00:00:00  0.788500
2013-01-01 00:30:00  0.761525
2013-01-01 01:00:00  0.751850
2013-01-01 01:30:00  0.746445
2013-01-01 02:00:00  0.688677

,我正在使用unstack用半小时的间隔作为列重塑它,并将日期作为行 - 如本答案所建议的。

df.index = [df.index.date, df.index.hour + df.index.minute / 60]
df = df['X'].unstack()
df.head()
              0.0       0.5       1.0       1.5       2.0       2.5   
2013-01-01  0.788500  0.761525  0.751850  0.746445  0.688677  0.652226   
2013-01-02  0.799029  0.705590  0.661059  0.627001  0.606560  0.592116   
2013-01-03  0.645102  0.597785  0.563410  0.516707  0.495896  0.492416   
2013-01-04  0.699592  0.649553  0.598019  0.576290  0.561023  0.537802   
2013-01-05  0.782781  0.706697  0.645172  0.627405  0.605972  0.583536

都很好。但是我现在想为许多数据范围执行相同的过程。最初,我正在使用2:

for df in [df1,df2]:
        df.index = [df.index.date, df.index.hour + df.index.minute / 60]
        df = df['X'].unstack()

重新索引有效,但重塑不:

df1.head()
                      X
2013-01-01 0.0  0.788500
           0.5  0.761525
           1.0  0.751850
           1.5  0.746445
           2.0  0.688677

我认为也许我需要等效于inplace,因此未堆放的数据框传递回df1df2

有什么建议?

问题原因

您需要检查分配的工作方式。布兰登·罗德斯(Brandon Rhodes(的演讲非常启发。

执行df = df['X'].unstack()时,您将df分配给df1df2的未堆放版本,具体取决于迭代,因此您有2个选项

解决方案

  • 在现场进行操作,但似乎没有一个内置的unstack

  • 保留对未堆放版本的另一个引用,并将df1df2分配给这些

这可以用元组,列表或dict。

来完成。

提取重塑

最简单的是将操作本身提取到单独的方法

def my_reshape(df):
    df_copy = df.copy() # so as to leave the original DataFrame intact
    df_copy.index = [df.index.date, df.index.hour + df.index.minute / 60]
    return df_copy['X'].unstack()

作为元组

df1, df2 = tuple(my_reshape(df) for df in (df1, df2))

具有dict

的变体
df_dict = {'df1': df1, 'df2': df2}
for key, df in df_dict.items():
    df_dict[key] = my_reshape(df)

,如果您需要在dict之外的

之外
df1 = df_dict['df1']
df2 = df_dict['df2']

最新更新