我有一个带有DatetimeIndex和一个整数值的Series。我想制作一张表,显示每次到其他所有后续时间的值变化。
下面是我想要的视觉表示。灰色和橙色单元格是无关的数据。
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()和相关函数来获得所需的形状?
答案 0 :(得分:2)
我认为您可以将np.substract
与np.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 = ...)
请注意,创建.time
和columns=
时index=
不是必需的,它是复制并粘贴可读的数据帧