在大熊猫groupby中获取不同大小的群体之间的差异

时间:2019-01-28 14:36:10

标签: python pandas pandas-groupby python-xarray

我需要计算如下数据中连续时间组之间的差异

A

我可以使用from io import StringIO import pandas as pd strio = StringIO("""\ date feat1 feat2 value 2016-10-15T00:00:00 1 1 0.0 2016-10-15T00:00:00 1 2 1.0 2016-10-15T00:00:00 2 1 2.0 2016-10-15T00:00:00 2 2 3.0 2016-10-15T00:01:00 1 1 8.0 2016-10-15T00:01:00 1 2 5.0 2016-10-15T00:02:00 1 1 8.0 2016-10-15T00:02:00 1 2 12.0 2016-10-15T00:02:00 2 1 10.0 2016-10-15T00:02:00 2 2 11.0 2016-10-15T00:03:00 1 1 12.0 2016-10-15T00:03:00 1 2 13.0 2016-10-15T00:03:00 2 1 14.0 2016-10-15T00:03:00 2 2 15.0""")

xarray

打印

df = pd.read_table(strio, sep='\s+')
dims = df.columns.values[:3].tolist()
df.set_index(dims, inplace=True) # needed to convert to xarray dataset
dataset = df.to_xarray()
diff_time = dataset.diff(dim=dims[0]) # take the diff in time
print(diff_time.to_dataframe().reset_index())

所以在2016年10月15日T00:01:00的瞬间,我有feat1:2缺少相关的差异是难的

我该如何以向量化方式在纯熊猫中做到这一点?用nan填充构造原始数据帧(使组大小相等)是一种选择,但可以避免

笨拙的方式是:

                   date  feat1  feat2  value
0   2016-10-15T00:01:00      1      1    8.0
1   2016-10-15T00:01:00      1      2    4.0
2   2016-10-15T00:01:00      2      1    NaN
3   2016-10-15T00:01:00      2      2    NaN
4   2016-10-15T00:02:00      1      1    0.0
5   2016-10-15T00:02:00      1      2    7.0
6   2016-10-15T00:02:00      2      1    NaN
7   2016-10-15T00:02:00      2      2    NaN
8   2016-10-15T00:03:00      1      1    4.0
9   2016-10-15T00:03:00      1      2    1.0
10  2016-10-15T00:03:00      2      1    4.0
11  2016-10-15T00:03:00      2      2    4.0

它确实输出相同的输出,但未矢量化

1 个答案:

答案 0 :(得分:2)

更新的解决方案:

df.unstack(0)['value']\
  .diff(axis=1)\
  .dropna(how='all', axis=1)\
  .unstack([0,1])\
  .rename('value')\
  .reset_index()

输出:

                   date  feat1  feat2  value
0   2016-10-15T00:01:00      1      1    8.0
1   2016-10-15T00:01:00      1      2    4.0
2   2016-10-15T00:01:00      2      1    NaN
3   2016-10-15T00:01:00      2      2    NaN
4   2016-10-15T00:02:00      1      1    0.0
5   2016-10-15T00:02:00      1      2    7.0
6   2016-10-15T00:02:00      2      1    NaN
7   2016-10-15T00:02:00      2      2    NaN
8   2016-10-15T00:03:00      1      1    4.0
9   2016-10-15T00:03:00      1      2    1.0
10  2016-10-15T00:03:00      2      1    4.0
11  2016-10-15T00:03:00      2      2    4.0

详细信息:

在创建三级MultiIndex之后,首先让我们取消堆栈0的日期,它将日期从行移动到列,然后对列使用diff,最后使用dropna删除第一个日期,其中整个列均为nan并取消堆栈feat1和feat2重新创建多索引并转换回数据框。