我对Python / Pandas比较陌生,并且想知道进行以下操作的最佳/最有效方法:
我有一组数据,随着时间的推移价格在不同的位置。数据最初是每日,但我使用groupby
功能汇总平均每月价格,并获得以下内容(简化示例):
anomes Market price
9508 mkt1 0.298387
mkt2 0.000000
9509 mkt1 0.254338
mkt2 0.289787
mkt3 0.071116
其中'anomes'是月度时间码(yy / mm)
我的问题是,对于每个时间段,计算每个“市场”对的价格差异的最佳方法是什么?
我想到的一个想法是“取消堆叠”,这样每行代表一个时间段,然后以这种方式迭代。在上面的df上调用unstack可以得到:
price
Market mkt1 mkt2 mkt3
anomes
9508 NaN 0.298387 0.000000
9509 0.254338 0.289787 0.071116
9510 0.255367 0.319558 0.199919
9511 0.341980 0.296720 0.236127
9512 0.420860 0.352125 0.198956
我最终希望得到的是:
price
Market mkt1 mkt2 mkt3 mkt1-mkt2 mkt1-mkt3 ... mkt2-mkt3 ...
9508 NaN 0.298387 0.000000 ... ... ... ...
9509 0.254338 0.289787 0.071116 ... ... ... ...
9510 0.255367 0.319558 0.199919 ... ... ... ...
9511 0.341980 0.296720 0.236127 ... ... ... ...
9512 0.420860 0.352125 0.198956 ... ... ... ...
我最终需要再次重塑为“长”格式。
我对如何在Python / Pandas中实现这一目标感到有些茫然。有没有人对最佳/最有效的方式有任何好的想法?
答案 0 :(得分:0)
你可以用concat(和itertools排列)来做到这一点:
In [11]: def column_difference(df, colname1, colname2):
s = df[colname1] - df[colname2]
s.name = '%s - %s' % (colname1, colname2)
return s
In [12]: from itertools import permutations
In [13]: pd.concat((column_difference(df, col1, col2)
for col1, col2 in permutations(df.columns, 2)
if col1 < col2), # assuming the column names are orderable (and unique)
axis=1)
Out[13]:
mkt1 - mkt2 mkt1 - mkt3 mkt2 - mkt3
Market
9508 NaN NaN 0.298387
9509 -0.035449 0.183222 0.218671
9510 -0.064191 0.055448 0.119639
9511 0.045260 0.105853 0.060593
9512 0.068735 0.221904 0.153169
你可以将这个结果连接到原始框架......