python - 取 pandas groupby 中不同大小的组之间的差异

标签 python pandas pandas-groupby python-xarray

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

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())

打印

                   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

因此,在 2016-10-15T00:01:00 的瞬间,我的 feat1:2 缺少相关差异是 nan

我怎样才能以矢量化的方式在纯 Pandas 中做到这一点?使用 nan 填充构建原始数据框(因此组大小相等)是一种选择,但应该避免

一个笨拙的方法是:

dfs = []
for k, v in zip(itertools.islice(df.groupby(level=0).groups.values(), 1, None),
                df.groupby(level=0).groups.values()):
    # print(df.loc(axis=0)[k.values] , df.loc(axis=0)[v.values])
    diff = df.loc(axis=0)[k.values].reset_index(level=0, drop=True) - \
           df.loc(axis=0)[v.values].reset_index(level=0, drop=True)
    diff = pd.concat([diff], keys=[k.values[0][0]], names=['date'])
    dfs.append(diff)
print(pd.concat(dfs).reset_index())

它确实打印相同的输出,但没有矢量化

最佳答案

更新的解决方案:

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 重新创建多索引并转换回数据帧。

关于python - 取 pandas groupby 中不同大小的组之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54404228/

相关文章:

python - 带有错误栏 : style does not apply 的 Pandas 图

python - 在某些条件下 Groupby 对象的最后一次出现

python - 在 Pandas 数据框中添加聚合/摘要行

pandas - 为什么 sum 和 lambda sum 在变换中不同?

python - 从Python 3中的Web服务下载文件

python - 如何在flask-sqlalchemy中为API端点设置唯一的字符串主键

python - 如何在 conda 环境中安装 keras 2.0.5 版本

python - 计算数据框中列中的每个值

python - 列出python中zip文件中文件夹内的所有文件

python - 从 pandas 数据帧中提取子集确保不重叠?