创建熊猫矢量化的“减”表

时间:2018-12-13 14:43:07

标签: python pandas

我有一个带有DatetimeIndex和一个整数值的Series。我想制作一张表,显示每次到其他所有后续时间的值变化。

下面是我想要的视觉表示。灰色和橙色单元格是无关的数据。

enter image description here 我想不出一种在大熊猫内部以矢量化样式创建此样式的方法。

z = pd.DatetimeIndex(periods=10, freq='H', start='2018-12-1')
import random
df = pd.DataFrame(random.sample(range(1, 100), 10), index=z, columns=['foo'])

我尝试过类似的事情:

df['foo'].sub(df['foo'].transpose())

但这不起作用。

输出DataFrame可以具有多索引(beforeTime,AfterTime),也可以是单个索引“ beforeTime”,然后为每个可能的“ aftertime”具有一列。我认为它们是等效的,因为我可以使用unstack()和相关函数来获得所需的形状?

1 个答案:

答案 0 :(得分:2)

我认为您可以将np.substractnp.outer一起使用来计算所有值并创建如下数据框:

df_output = pd.DataFrame(np.subtract.outer(df.foo, df.foo), 
                         columns= df.index.time, index=df.index.time)
print (df_output.head())
          00:00:00  01:00:00  02:00:00  03:00:00  04:00:00  05:00:00  \
00:00:00         0         6        -7       -57       -33         3   
01:00:00        -6         0       -13       -63       -39        -3   
02:00:00         7        13         0       -50       -26        10   
03:00:00        57        63        50         0        24        60   
04:00:00        33        39        26       -24         0        36   

          06:00:00  07:00:00  08:00:00  09:00:00  
00:00:00       -53       -28         5        17  
01:00:00       -59       -34        -1        11  
02:00:00       -46       -21        12        24  
03:00:00         4        29        62        74  
04:00:00       -20         5        38        50  

您可以使用np.triu将示例中所有灰色值设置为0,例如:

pd.DataFrame(np.triu(np.subtract.outer(df.foo, df.foo)), columns = ...)

请注意,创建.timecolumns=index=不是必需的,它是复制并粘贴可读的数据帧